返回 null 作为 int,允许使用三元运算符,但不允许使用 if 语句

让我们看一下以下代码段中的简单 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代码中,即使函数的返回类型是,该方法也不会发出编译器错误,并且我们正在尝试返回值(通过语句)。编译时,这显然会导致 运行时异常 。temp()intnullreturn true ? null : 0;NullPointerException

但是,如果我们用语句(如方法)表示三元运算符,则似乎同样的事情是错误的,这确实会发出编译时错误!为什么?ifsame()


答案 1

编译器将 解释为对 的 null 引用,应用条件运算符的自动装箱/取消装箱规则(如 Java 语言规范 15.25 中所述),然后愉快地继续前进。这将在运行时生成 ,您可以通过尝试进行确认。nullIntegerNullPointerException


答案 2

我认为,Java编译器解释为一个表达式,可以隐式转换为,可能给出。true ? null : 0IntegerintNullPointerException

对于第二种情况,表达式是特殊的 null 类型 see,因此代码会使类型不匹配。nullreturn null


推荐