if语句中的NullPointerException

时间:2012-03-28 23:59:58

标签: 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().compareTo(players[i + 1].getLastName()) > 0)
            temp = players[i];
        players[i] = players[i+1];
        players[i+1] =  temp;
        }
    }
}

我用Google搜索了错误报告,但似乎没有任何内容。如果有帮助,下面是Player类和getLastName()方法。此外,要发送到Player类的预期数据将是一个名称,以first-name和last-name的形式出现,所以类似“Bobby Joe”。

public class Player {

public String[] name;

public Player(String inputname) {

    name = inputname.split(" ");

}

public String getLastName() {
    return name[1];
}

非常感谢任何有关此事的帮助!

编辑 - 抱歉,是的,这是Java。 DOUBLE EDIT - 如果有人愿意看一下,我已将完整的源代码放到了Pastebin上。只要在 Team.sortPlayers()方法中调用 players [i] 数组,错误就会缩小。

http://pastebin.com/sJKTpJA9

9 个答案:

答案 0 :(得分:1)

问题在于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;
    }
 }

如果在第一遍中(即i == 0,compareTo方法返回一个等于或小于0的值,则指定temp的指向player数组元素0的指针将不会执行,temp将有一个空指针和接下来的两行,在if语句的范围内没有条件执行,将元素1分配给players数组的元素0和一个指向元素1的空指针。

在下一个传递(即i == 1)时,这将导致java.lang.NullPointerException,因为现在,players [1]元素具有来自第一遍的空指针。

根据输入的名称顺序,如果在第一次传递时compareTo方法返回值&gt;,则可能会抛出异常,也可能不抛出异常。 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;
        }
    }
}

将解决问题并且还有更好的缩进练习。

问题的一个可见指标是,样本中的缩进虽然不是if和for作用域的常规做法,但仍然表明只有数组元素swap的第一行在if语句的范围内而不是全部三条线。

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

答案 1 :(得分:0)

这一个:

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

有很多可能抛出NullPointerException:

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

答案 2 :(得分:0)

嗯......这里的东西显然是空的。

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

可能是

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

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

答案 3 :(得分:0)

从您显示的代码中。

players本身为null,因为您从未对其进行初始化(即您所显示的代码中没有new Player[x])。当你这样做

int n = players.length;

它蓬勃发展。你想要像

这样的东西

public Player [] players = new Player[n];

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

中初始化它
public Player [] players; // like you do now
...
players = new Player[n]; // in some constructor

答案 4 :(得分:0)

看起来你的.getLastName()返回null,当你尝试在一个null的对象上调用compareTo()时,你得到一个空指针异常。

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

答案 5 :(得分:0)

尝试使用调试器查看语句的哪一部分提供null结果。

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

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

答案 6 :(得分:0)

最好在使用if条件之前尝试打印名称,检查是否收到空例外。

答案 7 :(得分:0)

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

答案 8 :(得分:0)

确保正确初始化播放器阵列时

    for(int i=0; i < numPlayers; i++){
        playerArray[i] = new Player("Joseph Blog");
    }

确保所有玩家都有空格,否则当调用getlastname时,姓氏将为空值。也许你应该改变构造函数来代替两个字符串,因为那时你也可以允许中间名,并且每次你需要姓时都不需要拆分字符串。 确保您也不访问超出范围的数组的索引。