NullPointer除了没有明显的原因

时间:2014-04-29 06:55:09

标签: java nullpointerexception minecraft bukkit

我正在开发一个Bukkit插件(该错误与bukkit或它的api无关,但我包括了这个事实,即如果你不知道它是什么/避风港我是用它完整的#39;听说过你应该仍然可以回答这个问题)。我正在处理的插件是一个反聊天垃圾邮件插件。我没有明显的理由得到nullpointerexception。这是一些代码:

public class SpamListener implements Listener{
private HashMap<String, Long> lastMessage;
private HashMap<String, Integer> spamScore;

public void init(){
    lastMessage = new HashMap<String, Long>();
    spamScore = new HashMap<String, Integer>(); 
}

@EventHandler
public void playerChatEvent(AsyncPlayerChatEvent e){
    if(AntiGrief.instance.config.getBoolean("antispam.enabled") && (!e.getPlayer().hasPermission("antigrief.spam.bypass"))){
        Player player = e.getPlayer();
        String name = player.getName();
        int startingScore = spamScore.get(name); // <-- NullPointerException occurs here

        //More spam checking code here

    }
}

JavaPlugin类(主要类,对于那些不熟悉bukkit的人):

    spamListener = new SpamListener();
    spamListener.init(); // <-- yes the method is being called, same error occurs if the hashmap is instantiated in the constructor and declaration
    pm.registerEvents(spamListener, instance);

Stacktrace:http://pastebin.com/cciibpXp

提前感谢您的回答:)

1 个答案:

答案 0 :(得分:8)

我怀疑问题不是spamScore null - 它是地图中的值为空,因为您尚未填充地图。然后,您尝试取消null int引用{/ 1}}和 失败。所以想想你的代码:

Integer startingScoreReference = spamScore.get(name);
int startingScore = startingScoreReference.intValue();

现在很明显,如果startingScoreReferencenull(如果您的地图中没有name的条目,那么第二行将会导致NullPointerException。< / p>

所以基本上你需要 确保你的地图总是包含name的条目,或者你需要处理没有这种条目的情况。例如,您可能需要:

Integer mapValue = spamScore.get(name);
int startingScore = mapValue == null ? 0 : mapValue.intValue();

intValue()来电可能会转换为int,具体取决于您的偏好。)