我正在开发一个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
提前感谢您的回答:)
答案 0 :(得分:8)
我怀疑问题不是spamScore
null
- 它是地图中的值为空,因为您尚未填充地图。然后,您尝试取消null
int
引用{/ 1}}和 失败。所以想想你的代码:
Integer startingScoreReference = spamScore.get(name);
int startingScore = startingScoreReference.intValue();
现在很明显,如果startingScoreReference
为null
(如果您的地图中没有name
的条目,那么第二行将会导致NullPointerException
。< / p>
所以基本上你需要 确保你的地图总是包含name
的条目,或者你需要处理没有这种条目的情况。例如,您可能需要:
Integer mapValue = spamScore.get(name);
int startingScore = mapValue == null ? 0 : mapValue.intValue();
(intValue()
来电可能会转换为int
,具体取决于您的偏好。)