Hello, I wanted to make a short plugin which blocks snowball throwing but I have errors in console Code: package org.zi.aa; import java.util.logging.Logger; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.Action; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.plugin.java.JavaPlugin; public class Snowballs extends JavaPlugin implements Listener { protected static final Logger log = Logger.getLogger("Minecraft"); public void onEnable() { getServer().getPluginManager().registerEvents(this, this); log.info("[Snowballs] Plugin enabled"); } public void onDisable() { log.info("[Snowballs] Plugin disabled"); } @EventHandler public void onPlayerInteract(PlayerInteractEvent event) { Action action = event.getAction(); Player player = event.getPlayer(); if (action == Action.RIGHT_CLICK_AIR || action == Action.RIGHT_CLICK_BLOCK) { if (event.getItem().getType() == Material.SNOW_BALL) { player.sendMessage(ChatColor.RED + "Snowballs are temporarily disabled"); event.setCancelled(true); } } } } This code throws mi this error: Code: 13:00:17 [SEVERE] Could not pass event PlayerInteractEvent to Snowballs v1.0 org.bukkit.event.EventException at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:341) at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) at org.bukkit.plugin.TimedRegisteredListener.callEvent(TimedRegisteredListener.java:35) at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:477) at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:462) at org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent(CraftEventFactory.java:178) at net.minecraft.server.ItemInWorldManager.interact(ItemInWorldManager.java:376) at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:662) at net.minecraft.server.Packet15Place.handle(SourceFile:58) at net.minecraft.server.NetworkManager.b(NetworkManager.java:290) at net.minecraft.server.NetServerHandler.d(NetServerHandler.java:113) at net.minecraft.server.ServerConnection.b(SourceFile:39) at net.minecraft.server.DedicatedServerConnection.b(SourceFile:30) at net.minecraft.server.MinecraftServer.r(MinecraftServer.java:582) at net.minecraft.server.DedicatedServer.r(DedicatedServer.java:222) at net.minecraft.server.MinecraftServer.q(MinecraftServer.java:478) at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:413) at net.minecraft.server.ThreadServerApplication.run(SourceFile:856) Caused by: java.lang.NullPointerException at org.zi.aa.Snowballs.onPlayerInteract(Snowballs.java:32) at sun.reflect.GeneratedMethodAccessor77.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:339) ... 17 more Whats wrong? Im learning java for 1 day :/
gepardo43 To specify the error: you are assuming that the player holds anything. If the slot is empty, it is null. In this case, trying to call .getType() on null would throw an error. If you check if event.getItem() != null before you try .getType(), it should be fine
Weird, I don't get NPEs when I don't check if it's nothing. I just do it like : Code: @EventHandler public void onRightClick(PlayerInteractEvent e){ Player clicker = e.getPlayer(); if(e.getAction() == Action.RIGHT_CLICK_AIR){ if(clicker.getItemInHand().getType().equals(Material.SNOWBALL)){ e.setCancelled(true); clicker.sendMessage(ChatColor.RED + " Snowballs are temporarily disabled"); } } else if(e.getAction() == Action.RIGHT_CICK_BLOCK){ if(clicker.getItemInHand().getType().equals(Material.SNOWBALL)){ e.setCancelled(true); clicker.sendMessage(ChatColor.RED + " Snowballs are temporarily disabled"); } } }
ZeusAllMighty11 that is the difference between your code and his code then. PlayerInteractEvent has a method hasItem() that checks if the item is null, so the event itself can return null. It might be that your code does not :3 (which is perfectly fine)