三元运算符与 if 语句返回 int
在 Java 中,三元运算符 (?:) 允许赋值null 到 int 类型的变量,即使 int 是不支持 null 值的原始数据类型。考虑以下代码片段:
<code class="java">int temp() { return true ? null : 0; }</code>
在此代码中,如果计算条件为 true,则三元运算符将 null 分配给变量 temp,否则分配 0。编译器允许此分配而不会发出任何错误。然而,当该方法执行时,它会在运行时抛出 NullPointerException,因为 null 不是 int 的有效值。
与三元运算符相反,if 语句不允许对以下变量进行此类 null 赋值原始类型。例如:
<code class="java">int same() { if (true) { return null; } else { return 0; } }</code>
此代码将生成编译时错误,并显示消息“不兼容的类型:null 无法转换为 int”。造成这种差异的原因在于编译器处理 null 值的方式。
在三元运算符的情况下,编译器将 null 文字解释为对 Integer(int 的包装类)的 null 引用。这是由于自动装箱和拆箱的编译器规则所致:当从原始类型转换为对象类型时,Java 虚拟机 (JVM) 会自动将原始值包装在相应的对象包装器中。
因为 int 是一个原始类型,编译器会尝试对三元运算符返回的 null 值进行拆箱,这会导致 NullPointerException。
另一方面,if 语句不会执行此拆箱过程,并且 null 文字仍然存在作为对象的空引用。由于 Same() 方法的返回类型是 int,编译器无法将 null 引用转换为 int,因此会出现编译时错误。
以上是为什么三元运算符允许 int 返回 Null,而 if 语句不允许?的详细内容。更多信息请关注PHP中文网其他相关文章!