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()方法),那么看起来同样的事情是错误的,这会发出编译时错误! 为什么?


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


我认为,Java编译器解释为true ? null : 0 true ? null : 0作为Integer表达式,可以隐式转换为int ,可能会给出NullPointerException

对于第二种情况,表达式null是特殊的空类型,所以代码return null使得类型不匹配。


实际上,它全部在Java语言规范中进行了解释。

条件表达式的类型如下确定:

  • 如果第二个和第三个操作数具有相同的类型(可能是空类型),那么这就是条件表达式的类型。
  • 因此,您的(true ? null : 0)的“null”会获得一个int类型,然后自动写入Integer。

    尝试这样来验证这个(true ? null : null) ,你会得到编译器错误。

    链接地址: http://www.djcxy.com/p/31487.html

    上一篇: Tricky ternary operator in Java

    下一篇: Ternary operator (?:) in Bash