[Solved!]NullPointerException.... How?

Discussion in 'Plugin Development' started by russjr08, May 7, 2012.

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

    russjr08

    So for my plugin "iFail" I want to try to make a configuration file, and for now I want it to just have a simple "Enabled" key. It compiles fine and everything, but as soon as I trigger an event (Typing fail in the chat) I get a stack trace complaining about a null value. I'm having a hard time finding out whats null. It's reading the boolean value correctly because I even put a short little debug statement on load that prints what it is (Its true just like I have set as the default in config.yml).

    Code:
    20:05:03 [SEVERE] Could not pass event PlayerChatEvent to iFail
    org.bukkit.event.EventException
            at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.ja
    va:303)
            at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.jav
    a:62)
            at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.j
    ava:459)
            at net.minecraft.server.NetServerHandler.chat(NetServerHandler.java:786)
     
            at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:764)
            at net.minecraft.server.Packet3Chat.handle(Packet3Chat.java:34)
            at net.minecraft.server.NetworkManager.b(NetworkManager.java:229)
            at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:113)
            at net.minecraft.server.NetworkListenThread.a(NetworkListenThread.java:7
    8)
            at net.minecraft.server.MinecraftServer.w(MinecraftServer.java:551)
            at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:449)
            at net.minecraft.server.ThreadServerApplication.run(SourceFile:492)
    Caused by: java.lang.NullPointerException
            at me.russjr08.plugins.MyPlayerListener.onPlayerChat(MyPlayerListener.ja
    va:34)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
            at java.lang.reflect.Method.invoke(Unknown Source)
            at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.ja
    va:301)
    .. 11 more
    
    My code in the listener class is as follows.

    Code:
    package me.russjr08.plugins;
     
    import org.bukkit.ChatColor;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.player.PlayerChatEvent;
    import org.bukkit.event.player.PlayerJoinEvent;
     
    public class MyPlayerListener implements Listener{
        public static IFail plugin;
       
        private static final String[] keywords = {"fail", "fial", "f-a-i-l", "f.a.i.l.", "phail" };
         
        public void onPlayerJoin(PlayerJoinEvent event){
            Player player = event.getPlayer();
           
            player.sendMessage("iFail is enabled");
        }
       
        @EventHandler
        public void onPlayerChat(PlayerChatEvent event){
            Player player = event.getPlayer();
           
            /*if(player.isOp() && event.getMessage().toLowerCase().contains("fail") || event.getMessage().toLowerCase().contains("fial") || event.getMessage().toLowerCase().contains("f-a-i-l") || event.getMessage().toLowerCase().contains("f.a.i.l.") || event.getMessage().toLowerCase().contains("phail")){
                player.sendMessage(ChatColor.BLUE + "Ehh, you were close... lucky OPs!");
            }
            else if(event.getMessage().toLowerCase().contains("fail") || event.getMessage().toLowerCase().contains("fial") || event.getMessage().toLowerCase().contains("f-a-i-l") || event.getMessage().toLowerCase().contains("f.a.i.l.") || event.getMessage().toLowerCase().contains("phail") ){
                event.setCancelled(true);
                player.chat(ChatColor.DARK_RED + "I shouldn't say the word for doing something incorrectly!");
                player.kickPlayer("For failing!");
            } This is old very bad code... unorganized. Thanks to Canownueasy for showing me better ways of doing this!! */
                           
            boolean isEnabled = plugin.getConfig().getBoolean("Enabled");
           
            System.out.println("We are def. using this as the enabled value! " + isEnabled);
           
            if (isEnabled == true){
               
     
           
            if (!player.isOp()) {
                       
                     
                for (String inputWord : keywords) {
                    if (event.getMessage().toLowerCase().contains(inputWord)) {
                        event.setCancelled(true);
                                            player.chat(ChatColor.DARK_RED + "I shouldn't say the word for doing something incorrectly!");
                        player.kickPlayer("For failing!");
                        break;
                   
               
                                    }
            }
            }
           
       
                    if (player.isOp()) {
                       
                       
                        for (String inputWord : keywords) {
                            if (event.getMessage().toLowerCase().contains(inputWord)){
                                player.sendMessage(ChatColor.AQUA + "Ehh... you were close.. lucky OPs");
                            }
                        }
                    }
     
            }
    }
    }
     
     
    
    I may not be as good as using the bukkit API, but that if statement should be valid.
     
  2. Well I think line 34 is "boolean isEnabled = plugin.getConfig().getBoolean("Enabled");"
    Do you have the config.yml file with "Enabled: value" in it ? Because it can return null if not...

    You can use Boolean instead of boolean to make it accept null and then just check if it's true, false and null should be considered as false.
     
  3. Offline

    russjr08

    Unfortunately, in my config.yml file, there is a key that has Enabled: and it is set to true. I also took your advice and changed boolean to Boolean (Thanks for the tip!).

    I'm drawing a blank why its not detecting the values. Is there a way I need to "initialize" the config when using it in something other than the main class?
     
  4. When you first use getConfig() the config is loaded, after that it's just referenced... but I dunno what else to tell you, the code seems valid.
    Try with all lower case letters tough, maybe that's the problem.

    On another note, you can create another boolean value for player.isOp() and use it inside the loop instead of making duplicated code.... and you should break when you find the first word for the OP too, because if he says "fail fail fail" he'll get the messages 3 times.
    Also, store event.getMessage().toLowerCase() as well, converting a string to lower case every time you want to search for a word isn't pretty.
     
  5. Offline

    nala3

    You could also try to use regex instead of all of those if's
     
  6. Offline

    russjr08

    Regex tends to confuse me. Although I guess it would be easier to detect fail that way.

    And this is my short little config.yml :)

    Code:
    # Default Config File
    Enabled: true
    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: May 25, 2016
  7. Offline

    nala3

  8. Offline

    russjr08

  9. Offline

    Sagacious_Zed Bukkit Docs

    russjr08 According to my text editor, line 34 of MyPlayerListener.java: is this line
    Code:
            boolean isEnabled = plugin.getConfig().getBoolean("Enabled");
    
    as far as i can tell, it is never assigned a value.

    insert an expression to test if plugin is indeed null.
     
  10. Offline

    nala3

    russjr08
    Code:
    package me.russjr08.plugins;
     
    import org.bukkit.ChatColor;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.player.PlayerChatEvent;
    import org.bukkit.event.player.PlayerJoinEvent;
     
    public class MyPlayerListener implements Listener{
        private IFail plugin;
        public MyPlayerListener(IFail plugin){
            this.plugin = plugin;
        }
     
        private static final String[] keywords = {"fail", "fial", "f-a-i-l", "f.a.i.l.", "phail" };
     
        public void onPlayerJoin(PlayerJoinEvent event){
            Player player = event.getPlayer();
       
            player.sendMessage("iFail is enabled");
        }
     
        @EventHandler
        public void onPlayerChat(PlayerChatEvent event){
            Player player = event.getPlayer();
       
            /*if(player.isOp() && event.getMessage().toLowerCase().contains("fail") || event.getMessage().toLowerCase().contains("fial") || event.getMessage().toLowerCase().contains("f-a-i-l") || event.getMessage().toLowerCase().contains("f.a.i.l.") || event.getMessage().toLowerCase().contains("phail")){
                player.sendMessage(ChatColor.BLUE + "Ehh, you were close... lucky OPs!");
            }
            else if(event.getMessage().toLowerCase().contains("fail") || event.getMessage().toLowerCase().contains("fial") || event.getMessage().toLowerCase().contains("f-a-i-l") || event.getMessage().toLowerCase().contains("f.a.i.l.") || event.getMessage().toLowerCase().contains("phail") ){
                event.setCancelled(true);
                player.chat(ChatColor.DARK_RED + "I shouldn't say the word for doing something incorrectly!");
                player.kickPlayer("For failing!");
            } This is old very bad code... unorganized. Thanks to Canownueasy for showing me better ways of doing this!! */
                       
            boolean isEnabled = plugin.getConfig().getBoolean("Enabled");
       
            System.out.println("We are def. using this as the enabled value! " + isEnabled);
       
            if (isEnabled == true){
           
     
       
            if (!player.isOp()) {
                   
                 
                for (String inputWord : keywords) {
                    if (event.getMessage().toLowerCase().contains(inputWord)) {
                        event.setCancelled(true);
                                            player.chat(ChatColor.DARK_RED + "I shouldn't say the word for doing something incorrectly!");
                        player.kickPlayer("For failing!");
                        break;
               
           
                                    }
            }
            }
       
     
                    if (player.isOp()) {
                   
                   
                        for (String inputWord : keywords) {
                            if (event.getMessage().toLowerCase().contains(inputWord)){
                                player.sendMessage(ChatColor.AQUA + "Ehh... you were close.. lucky OPs");
                            }
                        }
                    }
     
            }
    }
    }
     
     
    
    try this :)
    Also, you will need to change how you instantiate this class. So if you do it from your main plugin class, you will need to have it something like, "new MyPlayerListener(this)"
     
  11. Offline

    russjr08

    Wow.. that worked :D

    Code:
    // Special thanks to nala3, we would have never had config options without this!
        public MyPlayerListener(IFail plugin){
            this.plugin = plugin;
        }
    Thank you soo much!!
     
Thread Status:
Not open for further replies.

Share This Page