如果传递最终对象,是否仍应检查null?

时间:2014-12-15 16:53:57

标签: java

查看以下代码:

    @Override
    public int compareTo(final Intersection o) {
        if (o == null) 
            return 0;

        double distance = t;
        double distance2 = o.t;

        if (distance == distance2) 
            return 0;


        return distance2 > distance ? -1 : 1;
    }

所有看起来都很好,但是在两个不同的条件场合返回0的事实确实让我感到有些困扰。但是,如果我将distancedistance2的变量赋值移到顶部,我的IDE会警告我

            if (o == null) 
              return 0;

然后会死了#39;码。如果是这种情况,在这种情况下甚至应该检查null吗?


我的意思是:

@Override
    public int compareTo(final Intersection o) {

        double distance = t;
        double distance2 = o.t;

        if (o == null) 
            return 0;

        if (distance == distance2) 
            return 0;


        return distance2 > distance ? -1 : 1;
    }

4 个答案:

答案 0 :(得分:12)

Final可能为null,只是意味着它无法分配,并且在匿名内部类等中可见。

在您的情况下,问题是不同的:(见评论)

public int compareTo(final Intersection o) {

    double distance = t;
    double distance2 = o.t; // here you use it, potentially causing NPE

    if (o == null) // if o was null, this is never reached
        return 0;

    if (distance == distance2) 
        return 0;


    return distance2 > distance ? -1 : 1;
}

答案 1 :(得分:2)

您的ide警告您,因为最终对象可以为null,您可以在

上获得空指针异常
double distance2 = o.t;

因此,if o == null内的return语句或任何语句将永远不会到达/执行

if (o == null) 
   return 0;

答案 2 :(得分:1)

我不完全确定您为什么不认为这是合法的,或者由于您的参数为final而无法发生这种情况:

yourClass.compareTo(null);

在使用实例之前,您应该始终检查依赖于实例的方案中的null

标记参数final会阻止您在方法中主动更改引用或改变值;它表示此代码没有传入值的副作用。

此外,我注意到您的compareTo方法存在问题;如果您要比较的对象是null,则比较器将其表示为等效对象。您还会遇到NaN==的边缘情况,因为两个double值可能完全等同

你可能想要这样的东西:

@Override
public int compareTo(final Intersection o) {

    double distance = t;
    double distance2 = o == null ? 0 : o.t;

    return Double.compare(distance, distance2);
}

答案 3 :(得分:1)

对于正在传递的对象来说,它是一个引用,因此无论天气是最终的,它都可以为null或不为null。