为什么在这种情况下我没有获得空指针异常,同时将空值添加到列表并对其进行排序

时间:2014-07-27 20:40:36

标签: java nullpointerexception

每当我将条件改为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;
    }

}

4 个答案:

答案 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语句中的行永远不会运行,并且避免出现空指针异常。