Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
新插件代码中未处理的异常,我可以';我不明白。Null[Minecraft Java]_Java_Null_Minecraft - Fatal编程技术网

新插件代码中未处理的异常,我可以';我不明白。Null[Minecraft Java]

新插件代码中未处理的异常,我可以';我不明白。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 :

我目前正在尝试制作一个更新的记分板,跟踪玩家的HP和当前的杀戮,但我没有太多的运气。我尝试了很多不同的方法,现在已经被困了两个多小时了。问题在于当试图让玩家获得HP和杀戮时。下面的错误是kills问题,但另一个问题是HP返回null,因此出现未处理的异常。 这里有一个错误:

代码如下: Main.java的第144-162行

@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