Java中的Tricky三元运算符 – 自动装箱

问题:

我们来看下面的代码片段中的简单的Java代码:

public class Main {

    private int temp() {
        return true ? null : 0;
        // No compiler error - the compiler allows a return value of null
        // in a method signature that returns an int.
    }

    private int same() {
        if (true) {
            return null;
            // The same is not possible with if,
            // and causes a compile-time error - incompatible types.
        } else {
            return 0;
        }
    }

    public static void main(String[] args) {
        Main m = new Main();
        System.out.println(m.temp());
        System.out.println(m.same());
    }
}

在这个最简单的Java代码中,即使函数的返回类型为inttemp()方法也不会发生编译器错误,我们正在尝试返回值null(通过语句return true ? null : 0;)。编译时,这显然会导致运行时异常NullPointerException
然而,如果我们用if语句(如same()方法)表示三进制运算符,似乎也是同样的事情,does发出编译时错误!为什么?

回答:

编译器将null解释为Integer的空引用,对条件运算符应用自动装箱/取消装箱规则(如Java Language Specification, 15.25所述),并快速移动。这将在运行时生成NullPointerException,您可以通过尝试来确认。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Tricky ternary operator in Java – autoboxing

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

8 + 2 =