未处理的异常类型异常?

时间:2015-02-15 15:11:00

标签: java bukkit

我正在尝试创建一个带有essentials命令/item的插件,并为每个项目提供一个绝杀。

我所提供的代码还没有传说部分,现在我只专注于重写/item命令,以便我可以编辑它。

public class main extends JavaPlugin implements Listener {
    public static Bukkit plugin;

    @Override
    public void onEnable()
    {
        Bukkit.getServer().getPluginManager().registerEvents(this, this);

        Bukkit.getConsoleSender().sendMessage(ChatColor.DARK_RED + "Enabled!");
    }

    @Override
    public void onDisable()
    {
        getLogger();
        Bukkit.getConsoleSender().sendMessage(ChatColor.DARK_RED + "Disabled!");
    }
    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        if (cmd.getName().equalsIgnoreCase("item")) { 

            Player user = (Player)sender;
            if (args.length < 1)
            {
                user.sendMessage("Not enough arguments");
            }
            Essentials essentials = (Essentials)getServer().getPluginManager().getPlugin("Essentials");

              IItemDb itemDB = essentials.getItemDb();
              ItemStack stack = essentials.getItemDb().get(args[0]);


            final String itemname = stack.getType().toString().toLowerCase(Locale.ENGLISH).replace("_", "");
            try
            {
                if (args.length > 1 && Integer.parseInt(args[1]) > 0)
                {
                    stack.setAmount(Integer.parseInt(args[1]));
                }
                }
            catch (NumberFormatException e)
            {
                user.sendMessage("Not enough arguements");
            }
            if (args.length > 2)
            {
                MetaItemStack metaStack = new MetaItemStack(stack);
                final boolean allowUnsafe = user.hasPermission("essentials.enchantments.allowunsafe");

                stack = metaStack.getItemStack();
            }


            if (stack.getType() == Material.AIR)
            {
                user.sendMessage("Can not spawn air");
            }

            final String displayName = stack.getType().toString().toLowerCase(Locale.ENGLISH).replace('_', ' ');
            user.sendMessage("Given " + stack.getAmount() + " " + displayName);
            if (user.hasPermission("essentials.oversizedstacks"))
            {
                InventoryWorkaround.addOversizedItems(user.getInventory(), 111, stack);
            }
            else
            { 
                InventoryWorkaround.addItems(user.getInventory(), stack);
            }
            user.updateInventory();
            return true;
        }
            return false; 
    }
}

在这一行:

ItemStack stack = essentials.getItemDb().get(args[0]);

我收到错误:

  

未处理的异常类型异常。

我可以通过重新排列底部关闭括号来解决这个问题,但是我会在底部关闭括号中出现错误。有谁知道发生了什么?

2 个答案:

答案 0 :(得分:1)

这是因为IItemDb.get(String)抛出了一个您未处理的已检查异常。必须处理已检查的异常,否则将引发编译时错误。来自§11.2

  

Java编程语言要求程序包含已检查异常的处理程序,这些处理程序可能是由于执行方法或构造函数而导致的。对于每个可能结果的已检查异常,方法的throws子句或构造函数必须提及该异常的类或该异常的类的一个超类

(强调我的)

因此,您必须扩展您的方法签名:

public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) throws Exception

答案 1 :(得分:1)

这条线 ItemStack stack = essentials.getItemDb().get(args[0]);可以抛出Exception

要处理它(并且它是强制性的),你必须用try / catch块包围这一行。

try {
    ItemStack stack = essentials.getItemDb().get(args[0]); 
} catch(Exception e) {
    e.printStackTrace();
}

另外,您可能需要阅读:Why not catch general Exceptions