查看以下代码:
@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的事实确实让我感到有些困扰。但是,如果我将distance
和distance2
的变量赋值移到顶部,我的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;
}
答案 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。