(Java-Spigot)我的PlayerInteractEvent有问题

(Java-Spigot)我的PlayerInteractEvent有问题,java,eclipse,bukkit,Java,Eclipse,Bukkit,我刚开始学习Spigot/Java,我的PlayerInteractEvent有一个问题。每次我右键单击或左键单击一个块(在冒险模式下),它都会显示出来。 我不知道是什么问题,你们能帮我吗 这是我的代码: @EventHandler public void onInteract(PlayerInteractEvent e) { Player p = e.getPlayer(); if (e.getItem().hasItemMeta() &

我刚开始学习Spigot/Java,我的PlayerInteractEvent有一个问题。每次我右键单击或左键单击一个块(在冒险模式下),它都会显示出来。 我不知道是什么问题,你们能帮我吗

这是我的代码:

    @EventHandler
    public void onInteract(PlayerInteractEvent e) {
        Player p = e.getPlayer();
        if (e.getItem().hasItemMeta() && e.getItem() != null){      
            
            if (e.getItem().getItemMeta().getDisplayName().equals("§b§lNavigator")) {
                p.openInventory(Main.CompassInventory);
                e.setCancelled(true);
            }
        }else{}
        
    }

}
这是错误代码:

[12:37:14 ERROR]: Could not pass event PlayerInteractEvent to hub v1.0
org.bukkit.event.EventException
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:305) ~[spigot-18.jar:git-Spigot-c3c767f-33d5de3]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot-18.jar:git-Spigot-c3c767f-33d5de3]
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:502) [spigot-18.jar:git-Spigot-c3c767f-33d5de3]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:487) [spigot-18.jar:git-Spigot-c3c767f-33d5de3]
        at org.bukkit.craftbukkit.v1_8_R1.event.CraftEventFactory.callPlayerInteractEvent(CraftEventFactory.java:226) [spigot-18.jar:git-Spigot-c3c767f-33d5de3]
        at net.minecraft.server.v1_8_R1.PlayerInteractManager.interact(PlayerInteractManager.java:463) [spigot-18.jar:git-Spigot-c3c767f-33d5de3]
        at net.minecraft.server.v1_8_R1.PlayerConnection.a(PlayerConnection.java:724) [spigot-18.jar:git-Spigot-c3c767f-33d5de3]
        at net.minecraft.server.v1_8_R1.PacketPlayInBlockPlace.a(PacketPlayInBlockPlace.java:50) [spigot-18.jar:git-Spigot-c3c767f-33d5de3]
        at net.minecraft.server.v1_8_R1.PacketPlayInBlockPlace.a(PacketPlayInBlockPlace.java:80) [spigot-18.jar:git-Spigot-c3c767f-33d5de3]
        at net.minecraft.server.v1_8_R1.PacketHandleTask.run(SourceFile:13) [spigot-18.jar:git-Spigot-c3c767f-33d5de3]
        at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) [?:?]
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) [?:?]
        at net.minecraft.server.v1_8_R1.MinecraftServer.z(MinecraftServer.java:696) [spigot-18.jar:git-Spigot-c3c767f-33d5de3]
        at net.minecraft.server.v1_8_R1.DedicatedServer.z(DedicatedServer.java:316) [spigot-18.jar:git-Spigot-c3c767f-33d5de3]
        at net.minecraft.server.v1_8_R1.MinecraftServer.y(MinecraftServer.java:634) [spigot-18.jar:git-Spigot-c3c767f-33d5de3]
        at net.minecraft.server.v1_8_R1.MinecraftServer.run(MinecraftServer.java:537) [spigot-18.jar:git-Spigot-c3c767f-33d5de3]
        at java.base/java.lang.Thread.run(Thread.java:832) [?:?]
Caused by: java.lang.NullPointerException: Cannot invoke "org.bukkit.inventory.ItemStack.hasItemMeta()" because the return value of "org.bukkit.event.player.PlayerInteractEvent.getItem()" is null
        at me.Items.Interact.onInteract(Interact.java:15) ~[?:?]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64) ~[?:?]
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
        at java.base/java.lang.reflect.Method.invoke(Method.java:564) ~[?:?]
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:301) ~[spigot-18.jar:git-Spigot-c3c767f-33d5de3]
        ... 16 more

您必须切换if中的语句,因为在对该项进行操作之前,首先必须检查该项是否为null。如果在null上操作,则会出现此异常。 “&&”很聪明,因此如果它左边的语句为false,那么它不会检查右边的另一个语句。 此外,您应该检查ItemMeta是否为null

    @EventHandler
public void onInteract(PlayerInteractEvent e) {
    Player p = e.getPlayer();
    if (e.getItem() != null && e.getItem().getItemMeta() != null && e.getItem().hasItemMeta()){      
        
        if (e.getItem().getItemMeta().getDisplayName().equals("§b§lNavigator")) {
            p.openInventory(Main.CompassInventory);
            e.setCancelled(true);
        }
    }else{}
    
}

您必须切换if中的语句,因为在对该项进行操作之前,首先必须检查该项是否为null。如果在null上操作,则会出现此异常。 “&&”很聪明,因此如果它左边的语句为false,那么它不会检查右边的另一个语句。 此外,您应该检查ItemMeta是否为null

    @EventHandler
public void onInteract(PlayerInteractEvent e) {
    Player p = e.getPlayer();
    if (e.getItem() != null && e.getItem().getItemMeta() != null && e.getItem().hasItemMeta()){      
        
        if (e.getItem().getItemMeta().getDisplayName().equals("§b§lNavigator")) {
            p.openInventory(Main.CompassInventory);
            e.setCancelled(true);
        }
    }else{}
    
}
真管用!真管用!