Development Assistance Internal error on command

Discussion in 'Plugin Help/Development/Requests' started by $nickWTN$, May 22, 2015.

Thread Status:
Not open for further replies.
  1. Offline

    $nickWTN$

    So this is my second plugin ever and I can't get it to work. I am a noob at java, so if you reply, make sure to explain yourself. I only have one class, which is my main. All that the plugin does is when you type /shrek <player> it kills them and sends out a server message and just doing /shrek will kill you and send a message.
    Code:
    package me.nickWTN.shrek;
    
    import org.bukkit.plugin.java.JavaPlugin;
    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.Server;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Player;
    
    public class shrek extends JavaPlugin{
        private Player player;
        private Server server;
       
        @SuppressWarnings("deprecation")
        public boolean onCommand(CommandSender sender, Command cmd, String commandlbl, String[] args){
            if(commandlbl.equalsIgnoreCase("shrek")){
                server = Bukkit.getServer();
                Player target = player.getServer().getPlayer(args[0]);
                if(target != null){           
                    if(args.length == 1){
                        target.setHealth(0);
                        server.broadcastMessage(target + " got shrekt by " + sender);
                    }
                    if(args.length == 0){
                        player.setHealth(0);
                        server.broadcastMessage(sender + " shrekt themself");
                    }
                    if(args.length < 0){
                        player.sendMessage(ChatColor.DARK_RED + "Not enough arguments!");
                    }
                    if(args.length > 1){
                        player.sendMessage(ChatColor.DARK_RED + "Too many arguments!");
                        }
                }
                if(target == null){
                    sender.sendMessage(ChatColor.DARK_RED + "That player is not online!");
                }
            }
            return true;
        }
    }
    
    When I start up the server, everything is fine, but when I do /shrek, it gives all there errors.
    Console Errors (open)

    [00:23:45] [Server thread/INFO]: nickWTN issued server command: /shrek
    [00:23:45] [Server thread/ERROR]: null
    org.bukkit.command.CommandException: Unhandled exception executing command 'shrek' in plugin shrek v1.0
    at org.bukkit.command.PluginCommand.execute(PluginCommand.java:46) ~[craftbukkit.jar:git-Bukkit-33d5de3]
    at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:140) ~[craftbukkit.jar:git-Bukkit-33d5de3]
    at org.bukkit.craftbukkit.v1_8_R1.CraftServer.dispatchCommand(CraftServer.java:625) ~[craftbukkit.jar:git-Bukkit-33d5de3]
    at net.minecraft.server.v1_8_R1.PlayerConnection.handleCommand(PlayerConnection.java:1058) [craftbukkit.jar:git-Bukkit-33d5de3]
    at net.minecraft.server.v1_8_R1.PlayerConnection.a(PlayerConnection.java:919) [craftbukkit.jar:git-Bukkit-33d5de3]
    at net.minecraft.server.v1_8_R1.PacketPlayInChat.a(SourceFile:37) [craftbukkit.jar:git-Bukkit-33d5de3]
    at net.minecraft.server.v1_8_R1.PacketPlayInChat.a(SourceFile:9) [craftbukkit.jar:git-Bukkit-33d5de3]
    at net.minecraft.server.v1_8_R1.PacketHandleTask.run(SourceFile:13) [craftbukkit.jar:git-Bukkit-33d5de3]
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.7.0_60]
    at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.7.0_60]
    at net.minecraft.server.v1_8_R1.MinecraftServer.z(MinecraftServer.java:656) [craftbukkit.jar:git-Bukkit-33d5de3]
    at net.minecraft.server.v1_8_R1.DedicatedServer.z(DedicatedServer.java:284) [craftbukkit.jar:git-Bukkit-33d5de3]
    at net.minecraft.server.v1_8_R1.MinecraftServer.y(MinecraftServer.java:609) [craftbukkit.jar:git-Bukkit-33d5de3]
    at net.minecraft.server.v1_8_R1.MinecraftServer.run(MinecraftServer.java:517) [craftbukkit.jar:git-Bukkit-33d5de3]
    at java.lang.Thread.run(Unknown Source) [?:1.7.0_60]
    Caused by: java.lang.NullPointerException
    at me.nickWTN.shrek.shrek.onCommand(shrek.java:19) ~[?:?]
    at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44) ~[craftbukkit.jar:git-Bukkit-33d5de3]
    ... 14 more


    FYI, I use Eclipse and it doesn't report any errors.
     
  2. Offline

    timtower Administrator Administrator Moderator

    Moved to Bukkit alternatives.
    @$nickWTN$ You are using args[0] while you never check its size.
     
  3. Offline

    TheDiamond06

  4. Offline

    $nickWTN$

    How exactly would I do that?
     
  5. @$nickWTN$ Same way you did later on in the code. Also use else ifs and not just ifs. Also use cmd.getName rather than commandlbl.
     
  6. Offline

    $nickWTN$

    So it would be something like this?
    Code:
    package me.nickWTN.Shrek;
    import org.bukkit.plugin.java.JavaPlugin;
    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.Server;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Player;
    public class Shrek extends JavaPlugin{
        private Player player;
        private Server server;
      
        @SuppressWarnings("deprecation")
        public boolean onCommand(CommandSender sender, Command cmd, String commandlbl, String[] args){
            if(cmd.getName().equalsIgnoreCase("shrek")){
                server = Bukkit.getServer();
                Player target = player.getServer().getPlayer(args[0]);
                if(target == null){
                   sender.sendMessage(ChatColor.DARK_RED + "That player is not online!");
                }
                else if(target != null){         
                    if(args.length == 1){
                        target.setHealth(0);
                        server.broadcastMessage(target + " got shrekt by " + sender);
                    }
                    else if(args.length == 0){
                        player.setHealth(0);
                           server.broadcastMessage(sender + " shrekt themself");
                       }
                       if(args.length > 1){
                           player.sendMessage(ChatColor.DARK_RED + "Too many arguments!");
                       }
                       else if(args.length < 0){
                           player.sendMessage(ChatColor.DARK_RED + "Not enough arguments!");
                       }
                   }
    
            }
            return true;
        }
    }
    I'm still not sure what to do checking the length.
    length(args[0]) errors and so does args[0].length
     
  7. Offline

    CoolGamerXD

    @$nickWTN$ Always check if sender instanceof player before casting player.

    Code:
     if (sender instanceof Player) {
    Player player = (Player) sender;
     
  8. Offline

    $nickWTN$

    Can you put that into my code?
     
  9. Offline

    CoolGamerXD

    @$nickWTN$ Remove that private Player player at the starting of your class. Now, when you define the command name that is "shrek". Under that method you will add
    Code:
     if (sender instanceof Player) {
    Player player = (Player) sender; 
    Then continue your code.

    NOTE-
    Basically what we are doing is that we're checking if sender is a Player.
     
Thread Status:
Not open for further replies.

Share This Page