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代码中,即使函数的返回类型是int
, temp()
方法也不会发出编译器错误,并且我们试图返回值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)
,你会得到编译器错误。