gpt4 book ai didi

java - 为什么 Java 编译器允许在三元运算符中将 null 转换为原始类型

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:08:37 24 4
gpt4 key购买 nike

这个小程序在三元运算符这一行抛出NullPointerException:

public class Main {
int someMethod() {
return (true ? null : 0);
}

public static void main(String[] args) {
Main obj= new Main();
obj.someMethod();
}
}

我明白原因是 null 不能转换为 int

但是,问题是为什么Java编译器允许这种代码通过,而像下面这样的东西会导致编译时错误:

int i = null; //Error: incompatible types: <nulltype> cannot be converted to int

最佳答案

通过 Java Language Specification - Conditional Operator , Java 将在运行时 计算条件表达式,而不是编译时。这就是在编译时未检测到错误的原因:

At run time, the first operand expression of the conditional expression is evaluated first. The resulting boolean value is then used to choose either the second or the third operand expression.

所以在你的情况下:

int someMethod() {
return (true ? null : 0);
}

imaging true 是一个包含复杂逻辑的方法,如果 Java 在运行时计算第一个操作数(在本例中为 true),这是有意义的。然后,根据规则:

If one of the second and third operands is of primitive type T, and the type of the other is the result of applying boxing conversion (§5.1.7) to T, then the type of the conditional expression is T.

由于第 3 个操作数 0 是原始类型 (T),因此表达式的类型将是 T 类型 (int)。因此,拆箱对 int 的空引用将导致 NPE。

关于java - 为什么 Java 编译器允许在三元运算符中将 null 转换为原始类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49952381/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com