因此,我需要使用InventoryClickEvent事件获取自定义清单中的自定义项目的名称。我尝试获取Item Meta,但它返回NullPointerException。因此,我做了一些if语句来处理未单击Meta和If语句的单击项。因此,该项目即使有知识和显示名称,也没有项目元。请注意,我对库存的处理不多,所以我有点陌生。另外,我在另一个类中设置了具有显示名称和知识的Item Meta,但我认为这不会影响任何内容。这是我的InventoryClickEvent类的代码。

public class clickEvent implements Listener
{
    private Files files = new Files();
    private KitPvP kit = KitPvP.getInstance();
    private Kit kits = new Kit();
    private InvUtils invUtils = new InvUtils();

    @EventHandler
    public void onInventoryClick(InventoryClickEvent e)
    {
        HumanEntity player = e.getWhoClicked();

        Inventory inv = e.getClickedInventory();
        ItemStack item = e.getCurrentItem();

        if (player instanceof Player)
        {
            if (inv != null && inv.getContents() != null && !inv.getContents().equals(Material.AIR) && inv.getName() != null && !inv.getName().equalsIgnoreCase(""))
            {
                String name = ChatColor.stripColor(inv.getName());

                if (name.equalsIgnoreCase("Kits: ") || name.equalsIgnoreCase("Kits:"))
                {
                    try
                    {
                        if (!kit.getDataFolder().exists())
                        {
                            kit.getDataFolder().mkdirs();
                        }

                        File kFolder = files.getFolder("Kits");
                        if (!kFolder.exists())
                        {
                            files.createFolder("Kits");
                        }

                        File menu = files.getFolder("GUI Menu");
                        if (!menu.exists())
                        {
                            files.createFolder("GUI Menu");
                        }
                        if (!e.getCursor().hasItemMeta())
                        {
                            Logger.log("Clicked Item does not have Item Meta!");
                            return;
                        }

                        if (!e.getCursor().getItemMeta().hasDisplayName())
                        {
                            Logger.log("Clicked Item does not have Display Name!");
                            return;
                        }
                        String check1Name = ChatColor.stripColor(e.getCursor().getItemMeta().getDisplayName());
                        String check2Name = check1Name.replace(" Kit", "");
                        File gItem = files.getGuiItem(check2Name);

                        if (!gItem.exists())
                        {
                            Logger.log("Cannot find required Files!");
                            return;
                        }
                        String itemName = gItem.getName();

                        if (itemName.equalsIgnoreCase(check2Name))
                        {
                            kits.equipKit(player, itemName);
                            e.setCancelled(true);
                        }
                    } catch (Exception ex)
                    {
                        ex.printStackTrace();
                    }
                }
            }

        }
    }
}

最佳答案

由于需要信息,因此很难理解您的问题,但是这里有问题。

1)我想您使用您的事件来结转项目等,因此e.getCursor()解析为Item。您确定检索到的对象在创建,绑定到事件中并传递时是否包含meta?不过,我的第一步是检查事件的发出者是否正在创建正确的信息。

2)在第一个if子句之前执行e.getCurrentItem();。这有点令人困惑,因为返回对象似乎是ItemStack。您的命名约定应重新考虑。其余的代码也一样。 ItemStack对象的内容是什么?为什么不能从那里检索有问题的项目?

3)如#1所述,检查事件的发出者正在做什么。因此,很可能没有发送ItemMeta

也是一个快速提示。避免使用较长的方法主体。尝试将问题分解为较小的问题。这将使调试和维护过程变得更加容易。最后,避免按原样对常量进行String相等性检查。由于“ someConstant” .equals(someVar)而不是someVar.equals(“ someConstant”)。这是避免使用NPE的不错技巧。

10-05 21:11
查看更多