Java:unary if - npe

时间:2011-10-18 13:38:16

标签: java if-statement nullpointerexception

为什么这段代码会导致NPE? Findbugs给了我一个提示,这可能会发生,有时会发生: - )

有什么想法吗?

public Integer whyAnNPE() {
    return 1 == 2 ? 1 : 1 == 2 ? 1 : null;
}

2 个答案:

答案 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。此外,查看方法的完整签名非常有用,而不是伪代码