每当我将条件改为i == 2或i == 3时,我总是得到NPE而不是5为什么? 我没有更多细节添加问题是自我解释我猜
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
public class Test{
public static void main(String args[]) throws Exception{
List<X> arr=new ArrayList<X>();
for(int i=0;i<5;i++){
arr.add(new X(i));
if(i==5){
arr.add(null);
}
}
Collections.sort(arr);
for(X x:arr){
System.out.println(x.i);
}
}
}
class X implements Comparable{
public int i;
public X(int i2) {
i=i2;
}
@Override
public int compareTo(Object o) {
return new Random().nextInt(10)-5;
}
}
答案 0 :(得分:1)
对于i
,该循环仅转到4,因此当您将条件更改为i == 5
时,最终不会插入任何内容。
答案 1 :(得分:0)
if(i==5){
arr.add(null);
}
从不执行,因为循环是从0到4.(for(int i=0;i<5;i++)
)。
顺便说一句,将null添加到列表中并不会导致NullPointerException本身。 导致execption的原因是尝试调用null实例的方法。
答案 2 :(得分:0)
这是因为你的for循环实际上从未达到5:
for(int i=0;i<5;i++)
由于您使用了严格的不等式,因此实际上只会循环显示值0,1,2,3和4。如果要包含5,则应使用&lt; =而不是&lt;。
我建议您熟悉断点,因为使用它们将是一种非常快速的方法,可以发现在代码执行时您从未实际添加过null。
答案 3 :(得分:0)
你的循环在i == 5
之前退出。看看你的for循环:
for( i = 0; i < 5; i++)
这意味着,在迭代循环之前,它会检查条件i < 5
是否为真。如果是这样,循环运行。之后,i增加1,然后再次进行检查。当i等于5时,检查失败,因为5不小于5.因此,if语句中的行永远不会运行,并且避免出现空指针异常。