java - (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
解决方案
您必须切换 if 中的语句,因为您首先必须检查该项目是否为空,然后再对其进行操作。如果您对 null 进行操作,则会出现此异常。"&&" 很聪明,所以如果它左边的语句是假的,那么它不会检查右边的另一个语句。此外,您应该检查 ItemMeta 是否为空。
@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{}
}
推荐阅读
- php - 具有动态值的自定义 WooCommerce 端点不起作用
- flutter - 刷新小部件,因为它们在可滚动列表中可见
- c++ - 通用回调函数的容器
- c# - 在 C# 中将文件从 Windows 上传到连接的 Linux 服务器
- cassandra - 有没有 Cassandra PCAP 分析器
- javascript - Mongoose - 如何在数组中添加和返回值的总和
- flutter - Flutter:除了用提供者包装嵌套导航器之外,是否有在多个路由之间共享提供者?
- spring-websocket - Spring Boot Websocket 缩放
- node.js - MongoDB中的多对多关系
- vue.js - Cordova 录像机在背面的手机摄像头上崩溃,在前面的摄像头上工作