我在以下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] 数组,错误就会缩小。
答案 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:
getLastName
可以返回null(如果您的name
成员变量为null)答案 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时,姓氏将为空值。也许你应该改变构造函数来代替两个字符串,因为那时你也可以允许中间名,并且每次你需要姓时都不需要拆分字符串。 确保您也不访问超出范围的数组的索引。