有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

eclipse(Java Spigot)我的PlayerInteractEvent有问题

我刚开始学习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

共 (1) 个答案

  1. # 1 楼答案

    您必须切换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{}
        
    }