Solved Bug in my Code?

Discussion in 'Plugin Development' started by MezzaDev, Dec 14, 2018.

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

    MezzaDev

    Hey, Im working on a plugin, and the following code is not working. This will be the first plugin i have made, so im new to the methods of doing things with bukkit in Java. This code for the command /mcportals outputs an internal error message when i run it with any arguments, but the error just says Null. It uses a HashMap to store temporary data about wether or not the player is currently creating a portal. Ive tried checking to make sure that the key in the HashMap exists, but that doesnt change anything. If you know a better way for storing this temporary data, im happy to change it.

    PHP:
    package me.mezzadev.mcportals.command;

    import java.util.HashMap;
    import org.bukkit.ChatColor;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandExecutor;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Player;
    import me.mezzadev.mcportals.Main;

    public class 
    MainCommand implements CommandExecutor {
       
        @
    SuppressWarnings("unused")
        private 
    Main plugin;
       
        private 
    HashMap<String,BooleanMarking = new HashMap<String,Boolean>();
        private 
    HashMap<String,StringPortalMarking = new HashMap<String,String>();
       
        public 
    MainCommand(Main plugin) {
            
    this.plugin plugin;
            
    plugin.getCommand("mcportals").setExecutor(this);
        }
       
        @
    Override
        
    public boolean onCommand(CommandSender senderCommand cmdString labelString[] args) {
            if (!(
    sender instanceof Player)) {
                
    sender.sendMessage("Only Players may use this command.");
                return 
    false;
            }
           
            
    Player p = (Playersender;
           
            if (
    args.length == 0) {
               
                
    // Send list of commands
               
                
    p.sendMessage(ChatColor.AQUA "                    -=+=- " ChatColor.AQUA "" ChatColor.BOLD " MC Portals " ChatColor.RESET ChatColor.AQUA " -=+=-");
                
    p.sendMessage(ChatColor.BLUE "                 A list of Commands for MC Portals");
                
    p.sendMessage("");
                
    p.sendMessage(ChatColor.AQUA " /mcportals create <name>" ChatColor.BLUE " Create a new Portal");
                
    p.sendMessage("");
               
                return 
    false;
            }
           
            if (
    args.length == 1) {
                if(
    args[0].equals("cancel")) {
                    if (!(
    Marking.get(p.getUniqueId().toString()).equals(null)) && Marking.get(p.getUniqueId().toString()).equals(true)) {
                        
    p.sendMessage(ChatColor.AQUA "You cancelled the creation of Portal " ChatColor.BLUE ChatColor.BOLD PortalMarking.get(p.getUniqueId().toString()));
                        
    p.getInventory().removeItem(Marker.getMarker());
                        
    Marking.remove(p.getUniqueId().toString());
                        
    PortalMarking.remove(p.getUniqueId().toString());
                        return 
    false;
                    }
                   
                    
    p.sendMessage(ChatColor.AQUA "You are not creating a Portal");
                   
                    return 
    false;
                }
            }
           
            if (
    args.length == 2) {
                if (
    args[0].equals("create")) {
                    if ((!
    Marking.get(p.getUniqueId().toString()).equals(null)) && Marking.get(p.getUniqueId().toString()).equals(false)) {
                        
    String name args[1];
                       
                        
    p.sendMessage(ChatColor.BLUE "                          -=+=-");
                        
    p.sendMessage(ChatColor.AQUA "Creating Portal " ChatColor.BLUE ChatColor.BOLD name);
                        
    p.sendMessage(ChatColor.AQUA "Use the " ChatColor.BLUE ChatColor.BOLD "Marker " ChatColor.RESET ChatColor.AQUA "To mark the Portal's corners " ChatColor.BLUE ChatColor.BOLD "(Right - Click)");
                        
    p.sendMessage(ChatColor.AQUA "You can cancel at any time with " ChatColor.BLUE "/mcportals cancel");
                        
    p.sendMessage(ChatColor.BLUE "                          -=+=-");
                       
                        if (!(
    p.getInventory().containsAtLeast(Marker.getMarker(), 1))) {
                            
    p.getInventory().addItem(Marker.getMarker());
                        }
                       
                        
    Marking.put(p.getUniqueId().toString(), true);
                        
    PortalMarking.put(p.getUniqueId().toString(), name);
                   
                        return 
    false;
                    }
                   
                    
    p.sendMessage(ChatColor.AQUA "You are already creating the portal " ChatColor.BLUE ChatColor.BOLD PortalMarking.get(p.getUniqueId().toString()));
                    
    p.sendMessage(ChatColor.AQUA "You can cancel it with " ChatColor.BLUE "/mcportals cancel" ChatColor.AQUA "or complete it with " ChatColor.BLUE "/mcportals complete");
                   
                    return 
    false;
                }
               
                return 
    false;
            }
           
            return 
    false;
        }
    }
    Thanks for any help.
     
  2. Have you registered the command in the plugin.yml?

    Also, if you get a stack trace, please post it.
     
  3. Offline

    MezzaDev

    Yeah, i have registered it. The command was working fine when i was not trying to store temporary data with a HashMap, and it is registered in the yml. Here is the full error message on the console:

    Code:
    [ERROR] null
    
    org.bukkit.command.CommandException: Unhandled exception executing command 'mcp' in plugin McPortals v1.0
    
    at org.bukkit.command.PluginCommand.execute(PluginCommand.java:46) ~[craftbukkit-1.13.2.jar:git-Bukkit-a3c2ec0]
    
    at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:138) ~[craftbukkit-1.13.2.jar:git-Bukkit-a3c2ec0]
    
    at org.bukkit.craftbukkit.v1_13_R2.CraftServer.dispatchCommand(CraftServer.java:682) ~[craftbukkit-1.13.2.jar:git-Bukkit-a3c2ec0]
    
    at net.minecraft.server.v1_13_R2.PlayerConnection.handleCommand(PlayerConnection.java:1580) ~[craftbukkit-1.13.2.jar:git-Bukkit-a3c2ec0]
    
    at net.minecraft.server.v1_13_R2.PlayerConnection.a(PlayerConnection.java:1440) ~[craftbukkit-1.13.2.jar:git-Bukkit-a3c2ec0]
    
    at net.minecraft.server.v1_13_R2.PacketPlayInChat.a(SourceFile:37) ~[craftbukkit-1.13.2.jar:git-Bukkit-a3c2ec0]
    
    at net.minecraft.server.v1_13_R2.PacketPlayInChat.a(SourceFile:9) ~[craftbukkit-1.13.2.jar:git-Bukkit-a3c2ec0]
    
    at net.minecraft.server.v1_13_R2.PlayerConnectionUtils.a(SourceFile:10) ~[craftbukkit-1.13.2.jar:git-Bukkit-a3c2ec0]
    
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_172]
    
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_172]
    
    at net.minecraft.server.v1_13_R2.SystemUtils.a(SourceFile:199) [craftbukkit-1.13.2.jar:git-Bukkit-a3c2ec0]
    
    at net.minecraft.server.v1_13_R2.MinecraftServer.b(MinecraftServer.java:843) [craftbukkit-1.13.2.jar:git-Bukkit-a3c2ec0]
    
    at net.minecraft.server.v1_13_R2.DedicatedServer.b(DedicatedServer.java:382) [craftbukkit-1.13.2.jar:git-Bukkit-a3c2ec0]
    
    at net.minecraft.server.v1_13_R2.MinecraftServer.a(MinecraftServer.java:796) [craftbukkit-1.13.2.jar:git-Bukkit-a3c2ec0]
    
    at net.minecraft.server.v1_13_R2.MinecraftServer.run(MinecraftServer.java:699) [craftbukkit-1.13.2.jar:git-Bukkit-a3c2ec0]
    
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_172]
    
    Caused by: java.lang.NullPointerException
    
    at me.mezzadev.mcportals.command.MainCommand.onCommand(MainCommand.java:64) ~[?:?]
    
    at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44) ~[craftbukkit-1.13.2.jar:git-Bukkit-a3c2ec0]
    
    ... 15 more
    Turns out ive been fiddling with the code and ive managed to get it working myself. The problem was as id suspected, there was an error because i was trying to check the value of a key in the HashMap when the key i was finding the value of didnt exist. Ive fixed this by adding a few extra tests for cases where the key didnt exist. Here is my updated code:

    PHP:
    package me.mezzadev.mcportals.command;

    import java.util.HashMap;
    import org.bukkit.ChatColor;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandExecutor;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Player;
    import me.mezzadev.mcportals.Main;

    public class 
    MainCommand implements CommandExecutor {
       
        @
    SuppressWarnings("unused")
        private 
    Main plugin;
       
        private 
    HashMap<String,BooleanMarking = new HashMap<String,Boolean>();
        private 
    HashMap<String,StringPortalMarking = new HashMap<String,String>();
       
        public 
    MainCommand(Main plugin) {
            
    this.plugin plugin;
            
    plugin.getCommand("mcportals").setExecutor(this);
        }
       
        @
    Override
        
    public boolean onCommand(CommandSender senderCommand cmdString labelString[] args) {
            if (!(
    sender instanceof Player)) {
                
    sender.sendMessage("Only Players may use this command.");
                return 
    false;
            }
           
            
    Player p = (Playersender;
           
            if (
    args.length == 0) {
               
                
    // Send list of commands
               
                
    p.sendMessage(ChatColor.AQUA "                    -=+=- " ChatColor.AQUA "" ChatColor.BOLD " MC Portals " ChatColor.RESET ChatColor.AQUA " -=+=-");
                
    p.sendMessage(ChatColor.BLUE "                 A list of Commands for MC Portals");
                
    p.sendMessage("");
                
    p.sendMessage(ChatColor.AQUA " /mcportals create <name>" ChatColor.BLUE " Create a new Portal");
                
    p.sendMessage("");
               
                return 
    false;
            }
           
            if (
    args.length == 1) {
                if(
    args[0].equals("cancel")) {
                    if (!(
    Marking.containsKey(p.getUniqueId().toString()))) {
                        
    p.sendMessage(ChatColor.AQUA "You are not creating a Portal");
                        return 
    false;
                    }
                   
                    if (
    Marking.get(p.getUniqueId().toString()).equals(true)) {
                        
    p.sendMessage(ChatColor.AQUA "You cancelled the creation of Portal " ChatColor.BLUE ChatColor.BOLD PortalMarking.get(p.getUniqueId().toString()));
                        
    p.getInventory().removeItem(Marker.getMarker());
                        
    Marking.remove(p.getUniqueId().toString());
                        
    PortalMarking.remove(p.getUniqueId().toString());
                        return 
    false;
                    }
                    return 
    false;
                }
            }
           
            if (
    args.length == 2) {
                if (
    args[0].equals("create")) {
                    if (
    Marking.containsKey(p.getUniqueId().toString()) || (Marking.containsKey(p.getUniqueId().toString()) && !(Marking.get(p.getUniqueId().toString()).equals(null)))) {
                        
    p.sendMessage(ChatColor.AQUA "You are already creating the portal " ChatColor.BLUE ChatColor.BOLD PortalMarking.get(p.getUniqueId().toString()));
                        
    p.sendMessage(ChatColor.AQUA "You can cancel it with " ChatColor.BLUE "/mcportals cancel" ChatColor.AQUA "or complete it with " ChatColor.BLUE "/mcportals complete");
                       
                        return 
    false;
                    }
                   
                    if (!(
    Marking.containsKey(p.getUniqueId().toString())) || Marking.get(p.getUniqueId().toString()).equals(false)) {
                        
    String name args[1];
                       
                        
    p.sendMessage(ChatColor.BLUE "                          -=+=-");
                        
    p.sendMessage(ChatColor.AQUA "Creating Portal " ChatColor.BLUE ChatColor.BOLD name);
                        
    p.sendMessage(ChatColor.AQUA "Use the " ChatColor.BLUE ChatColor.BOLD "Marker " ChatColor.RESET ChatColor.AQUA "To mark the Portal's corners " ChatColor.BLUE ChatColor.BOLD "(Right - Click)");
                        
    p.sendMessage(ChatColor.AQUA "You can cancel at any time with " ChatColor.BLUE "/mcportals cancel");
                        
    p.sendMessage(ChatColor.BLUE "                          -=+=-");
                       
                        if (!(
    p.getInventory().containsAtLeast(Marker.getMarker(), 1))) {
                            
    p.getInventory().addItem(Marker.getMarker());
                        }
                       
                        
    Marking.put(p.getUniqueId().toString(), true);
                        
    PortalMarking.put(p.getUniqueId().toString(), name);
                   
                        return 
    false;
                    }
                   
                    return 
    false;
                }
               
                return 
    false;
            }
           
            return 
    false;
        }
    }
    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Dec 14, 2018
Thread Status:
Not open for further replies.

Share This Page