新插件代码中未处理的异常,我可以';我不明白。Null[Minecraft Java]
我目前正在尝试制作一个更新的记分板,跟踪玩家的HP和当前的杀戮,但我没有太多的运气。我尝试了很多不同的方法,现在已经被困了两个多小时了。问题在于当试图让玩家获得HP和杀戮时。下面的错误是kills问题,但另一个问题是HP返回null,因此出现未处理的异常。 这里有一个错误: 代码如下: Main.java的第144-162行新插件代码中未处理的异常,我可以';我不明白。Null[Minecraft Java],java,null,minecraft,Java,Null,Minecraft,我目前正在尝试制作一个更新的记分板,跟踪玩家的HP和当前的杀戮,但我没有太多的运气。我尝试了很多不同的方法,现在已经被困了两个多小时了。问题在于当试图让玩家获得HP和杀戮时。下面的错误是kills问题,但另一个问题是HP返回null,因此出现未处理的异常。 这里有一个错误: 代码如下: Main.java的第144-162行 @SuppressWarnings("deprecation") public void run(String arena){ for(String key :
@SuppressWarnings("deprecation")
public void run(String arena){
for(String key : Handler.playerMap.keySet()){
if (Handler.playerMap.get(key).contains(arena)){
Player pt = Bukkit.getPlayer(key);
String p = pt.getDisplayName();
ScoreboardManager manager = Bukkit.getScoreboardManager();
Scoreboard board = manager.getNewScoreboard();
Objective objective = board.registerNewObjective("test", "dummy");
objective.setDisplaySlot(DisplaySlot.SIDEBAR);
objective.setDisplayName(ChatColor.AQUA + "Wave: " );
Score score = objective.getScore(ChatColor.GREEN + "" + pt.getHealth() + ChatColor.WHITE + p + ChatColor.AQUA);
int kills = PlayerHandler.kills.get(p);
score.setScore(kills);
int pcheck = 0;
有人能告诉我问题出在哪里吗?提前感谢您的评论。正如您所指出的,当
PlayerHandler.kills
返回空值,或者当获得玩家HP返回空值时,就会发生这种情况。发生这种情况的原因是您试图对空对象执行方法。因此,在上面的示例中,当您尝试对空对象get(p)
时,您会得到这个异常
您可以通过添加空性检查来避免NullPointerException
,以确保对象在调用方法之前不为空。例如,下面将检查是否有任何杀戮,如果没有,则将分数设置为零:
int kills = 0;
if (PlayerHandler.kills != null) {
kills = PlayerHandler.kills.get(p);
}
score.setScore(kills);
您必须执行类似的操作,以避免hp为空的情况
请看一看关于空指针以及如何避免它们的更多细节。免责声明:我在Minecraft插件开发方面没有任何经验。但我在Minecraft Mod开发方面确实有一些经验。 我想问题是没有球员杀过人。异常堆栈跟踪显示异常发生在第160行:
int kills = PlayerHandler.kills.get(p);
NullPointerException
表示某个内容为空。在该行中,只有PlayerHandler.kills
和p
可以为空。然而,p
实际上是玩家的显示名,我认为玩家不能将null
作为显示名。因此消除了p==null
的可能性
现在只有一个东西可以为空,杀死
。我相信kills
属于HashMap
类型。根据我的常识,这是一张地图,包含所有玩家的名字作为键,玩家的击杀次数作为值
那么为什么散列映射是空的呢?也许还没有人被杀。我过去常常在Minecraft中乱搞记分板,我知道除了0分之外,你还可以“没有分数”,我认为在源代码中它表示为null
如何解决这个问题:
很多方法
- 杀人
- 用箭或药水自杀(如果你永远孤独)
- 添加检查以查看映射是否为空(推荐)
int kills = 0;
if (PlayerHandler.kills != null) {
kills = PlayerHandler.kills.get(p);
}
score.setScore(kills);
但是PlayerHandler.kills中的数据不是空的 这将设置玩家在加入时杀死:
@EventHandler
public void onPlayerLogin(PlayerJoinEvent e) {
String player = e.getPlayer().getName();
if(!PlayerHandler.GPlayed.containsKey(player)){
PlayerHandler.GPlayed.put(player, 0);
}
if(!PlayerHandler.kills.containsKey(player)){
PlayerHandler.kills.put(player, 0);
}
if(!PlayerHandler.HRound.containsKey(player)){
PlayerHandler.HRound.put(player, 0);
}
}
这是我尝试创建的一个调试,但是在相关检查都正确的情况下仍然会出现相同的错误
@SuppressWarnings("deprecation")
public void run(String arena){
for(String key : Handler.playerMap.keySet()){
if (Handler.playerMap.get(key).contains(arena)){
Player pt = Bukkit.getPlayer("Nubzz");
String p = pt.getDisplayName();
Player nubzz = Bukkit.getPlayer("Nubzz");
nubzz.sendMessage(key);
nubzz.sendMessage(pt + "");
nubzz.sendMessage(p);
ScoreboardManager manager = Bukkit.getScoreboardManager();
Scoreboard board = manager.getNewScoreboard();
Objective objective = board.registerNewObjective("test", "dummy");
objective.setDisplaySlot(DisplaySlot.SIDEBAR);
objective.setDisplayName(ChatColor.AQUA + "Wave: " );
Score score = objective.getScore(ChatColor.GREEN + "" + pt.getHealth() + ChatColor.WHITE + p + ChatColor.AQUA);
int kills = PlayerHandler.kills.get(p);
score.setScore(kills);
int pcheck = 0;
这显示调试正在工作,并显示播放机已终止(可能我正在检查错误的变量值):
假设所有静态变量都已正确初始化,则行
int kills=PlayerHandler.kills.get(p)代码>仍可能导致NullPointerException
这是因为尝试将null
赋值给primative变量将引发NullPointerException
Integer test = null;
int thisWillThrowNPE = test;
PlayerHandler.kills可能为空,即使p
为空,您也不会在这一行得到NullPointerException