Java/Bukkit中无法从HashMap获取值的问题求助
问题分析与解决:Map.get()返回Null导致拆箱报错
你的代码如下:
public HashMap<Player, Boolean> running = new HashMap<>(); public void load(Player player){ running.put(player, true); } @Eventhandler public void onInteract(PlayerInteractEvent event){ if(!running.get(player)) return; //More stuff happening here }
触发的报错:
Cannot invoke "java.lang.Boolean.booleanValue()" because the return value of "java.util.Map.get(Object)" is null
核心问题与修复方案
未正确获取事件中的玩家对象
onInteract方法里的player变量未定义,必须从PlayerInteractEvent中获取玩家实例:event.getPlayer(),这是基础的代码逻辑错误。Null拆箱引发的异常
当running中不存在目标玩家的键时,get()方法会返回null。直接对返回值使用!操作符会触发Boolean到boolean的自动拆箱,null拆箱必然抛出NullPointerException。解决方式有两种:- 使用
getOrDefault方法,指定默认值避免null:if (!running.getOrDefault(event.getPlayer(), false)) return; - 先判断键是否存在,再取值:
Player player = event.getPlayer(); if (!running.containsKey(player) || !running.get(player)) return;
- 使用
事件注解拼写错误
注解@Eventhandler的正确写法是@EventHandler(首字母H大写),拼写错误会导致事件方法无法被Bukkit注册,这也是常见的隐性问题。
修复后的完整代码示例
public HashMap<Player, Boolean> running = new HashMap<>(); public void load(Player player){ running.put(player, true); } @EventHandler public void onInteract(PlayerInteractEvent event){ Player player = event.getPlayer(); // 使用getOrDefault避免null拆箱 if (!running.getOrDefault(player, false)) { return; } // 后续业务逻辑 }
内容的提问来源于stack exchange,提问作者Patnase
相关产品推荐
相关产品推荐

