为什么这段代码会导致NPE? Findbugs给了我一个提示,这可能会发生,有时会发生: - )
有什么想法吗?
public Integer whyAnNPE() {
return 1 == 2 ? 1 : 1 == 2 ? 1 : null;
}
答案 0 :(得分:4)
编辑:当我写这个答案时,问题中的代码不存在。
这是另一种让它更清晰的方法:
public static Integer maybeCrash(boolean crash) {
return true ? (crash ? null : 1) : 0;
}
重要的是,我们在这里有两个条件表达式。由于section 15.25中指定的类型的确定中的最后一个要点,内部属于Integer
类型。
那时,我们遇到了这样的情况:
public static Integer maybeCrash(boolean crash) {
Integer tmp = null;
return true ? tmp : 0;
}
现在,对于剩余的条件表达式,将应用上一个项目符号点,并执行binary numeric promotion。这反过来调用unboxing作为第一步 - 失败。
换句话说,像这样的条件:
condition ? null-type : int
可能会将int
打包到Integer
,但有条件的是这样:
condition ? Integer : int
可能会将Integer
拆分为int
。
原始回答
这是一个相当简单的例子,实际上是有效的Java:
public class Test {
public static void main(String[] args) {
int x = args.length == 0 ? 1 : null;
}
}
这是有效的:
int tmp;
if (args.length == 0) {
tmp = 1;
} else {
Integer boxed = null;
tmp = boxed.intValue();
}
显然,这里的拆箱步骤将会爆炸。基本上是因为将空表达式隐式转换为Integer
,并通过拆箱从Integer
隐式转换为int
。
答案 1 :(得分:0)
原始数据类型(int,long,float,double等)不能是null
,只有对象可以为null。此外,查看方法的完整签名非常有用,而不是伪代码