Java if语句中的NullPointerException
我在下面的if语句中遇到了NullPointerExceptionJava 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
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]可以为空(例如,您没有正确初始化阵列)
- 第一个
可以返回null(如果getLastName
成员变量为null)name
- 玩家[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;
}
}
}