Java if语句中的NullPointerException

Java if语句中的NullPointerException,java,if-statement,nullpointerexception,Java,If Statement,Nullpointerexception,我在下面的if语句中遇到了NullPointerException public Player players[]; public void sortPlayers() { int n = players.length; for (int pass=1; pass < n; pass++){ for (int i=0; i < n-pass; i++) { if(players[i].getLastName().compar

我在下面的if语句中遇到了NullPointerException

public Player players[];

public void sortPlayers() {
    int n = players.length;

    for (int pass=1; pass < n; pass++){
        for (int i=0; i < n-pass; i++) {
            if(players[i].getLastName().compareTo(players[i + 1].getLastName()) > 0)
            temp = players[i];
        players[i] = players[i+1];
        players[i+1] =  temp;
        }
    }
}
在此问题上的任何帮助都将不胜感激

编辑-对不起,是的,这是Java。 双重编辑-如果有人愿意看的话,我已经将完整的源代码放到了一个粘贴箱中。错误范围已缩小到在Team.sortPlayers()方法中调用玩家[i]数组时

这个:

if(players[i].getLastName().compareTo(players[i + 1].getLastName()) > 0)
有很多可能抛出NullPointerException:

  • 玩家[i]可以为空(例如,您没有正确初始化阵列)
  • 第一个
    getLastName
    可以返回null(如果
    name
    成员变量为null)
  • 玩家[i+1]可以为空

    • 嗯。。。这里有些东西显然是空的

      if(players[i].getLastName().compareTo(players[i + 1].getLastName()) > 0)
      
      可能是

      players
      players[i]
      players[i].GetLastName()
      players[i + 1]
      players[i + 1].GetLastName()
      

      我们无法知道是哪个,您必须使用调试器。

      根据您显示的代码

      players
      本身为空,因为您从未初始化它(即,您显示的代码中没有
      newplayer[x]
      )。当你这样做的时候

      int n=players.length

      它发出隆隆声。你想要什么

      public Player[]players=新玩家[n]

      在你知道什么是
      n
      之后的某个地方。也许在构造函数中初始化它

      public Player [] players; // like you do now
      ...
      players = new Player[n]; // in some constructor
      

      看起来.getLastName()返回null,当您尝试对null对象调用compareTo()时,会出现null指针异常


      确保姓氏不会返回null,或者如果null有效,则在其周围添加null检查

      尝试使用调试器查看语句的哪个部分给出了
      null
      结果

      或者,您可以稍微分解一下代码,以便更容易地找到问题

      String playerName = players[i].getLastName();
      String nextPlayerName = players[i+1].getLastName();
      if(playerName.compareTo(nextPlayerName) > 0) 
      {
          ...
      }
      

      最好在使用if条件检查是否得到空异常之前打印名称。

      我认为
      players[i+1]。getLastName()
      在指针到达最后一个索引时给出空指针。

      确保正确初始化players数组时

          for(int i=0; i < numPlayers; i++){
              playerArray[i] = new Player("Joseph Blog");
          }
      
      for(int i=0;i
      确保所有玩家都有空间,否则当调用getlastname时,LastName将有一个空值。也许您应该将构造函数改为使用两个字符串,因为这样您也可以允许使用中间名,而不必每次需要姓氏时都拆分字符串。
      请确保不要访问超出边界的数组并对其进行索引。

      问题在于if语句:

      for (int pass=1; pass < n; pass++){ 
          for (int i=0; i < n-pass; i++) { 
              if(players[i].getLastName().compareTo(players[i + 1].getLastName()) > 0) 
              temp = players[i]; 
          players[i] = players[i+1]; 
          players[i+1] =  temp;
          }
       }
      
      for(int pass=1;pass0)
      temp=玩家[i];
      玩家[i]=玩家[i+1];
      玩家[i+1]=临时工;
      }
      }
      
      如果,第一关,(即i==0,compareTo方法返回一个等于或小于0的值,将temp指针分配给players数组的元素0的语句将不会执行,temp将有一个空指针,并且在if语句的范围内没有条件执行的下两行将把元素1分配给players数组的元素0和一个空指针指向元素1的指针

      在下一次传递(即i==1)时,这将导致java.lang.NullPointerException,因为现在players[1]元素从第一次传递开始就有一个空指针

      根据名称输入的顺序,如果compareTo方法在第一次传递时返回的值大于0,则可能会引发异常,也可能不会引发异常。从该点开始,temp将有一个有效指针,但无论它指向什么,都将与i+1元素交换,即使它不指向第i个元素。数组的名称内容如下所示:由于名称sawp不会按预期出现,因此可能会损坏

      正在修复要读取的代码段:

      for (int pass=1; pass < n; pass++) { 
          for (int i=0; i < n-pass; i++) { 
              if(players[i].getLastName().compareTo(players[i + 1].getLastName()) > 0) {
                  temp = players[i]; 
                  players[i] = players[i+1]; 
                  players[i+1] =  temp;
              }
          }
      }
      
      for(int pass=1;pass0){
      temp=玩家[i];
      玩家[i]=玩家[i+1];
      玩家[i+1]=临时工;
      }
      }
      }
      
      将解决问题,也有更好的压痕练习

      问题的一个明显迹象是,示例中的缩进虽然不是if和for作用域的正常做法,但仍然表明只有数组元素交换的第一行在if语句的作用域中,而不是全部三行


      如果范围错误是软件错误的常见根源。

      那么我可以假设这是C#?@EdS.Java,给定
      String
      中的大写字母
      S
      ,小写方法名称和OP的问题历史。你试过使用调试器吗?你在哪里初始化玩家数组?@MΓ
      string
      是的别名,但考虑到历史记录,您可能是对的。My(大约)重点是我/我们不应该猜测。可能是这样,也可能是四种其他的可能性。还有其他的可能性,但它至少说明了调试这个的方法。谢谢,但不是这样;我已经尝试在.getLastName()上放置硬编码的a虚拟输出方法,但我仍然得到NullPointerException。这对我来说非常复杂。\好的,但使用相同的方法。检查代码中调用属性或方法的任何内容。错误消息说什么?关于行号的任何内容?if语句就是行号,先生。现在正反向工作以尝试查找问题。\谢谢!Th绝对有助于调试。我发现无论何时调用players[1]都是一个问题。抱歉,忘了提及我的构造函数中有
      这个。players[k]=新的Player(名称[k]);
      。无论何时调用players数组,它都会出现空值
      for (int pass=1; pass < n; pass++) { 
          for (int i=0; i < n-pass; i++) { 
              if(players[i].getLastName().compareTo(players[i + 1].getLastName()) > 0) {
                  temp = players[i]; 
                  players[i] = players[i+1]; 
                  players[i+1] =  temp;
              }
          }
      }