三元运算符与 if 语句返回 null int
在 Java 中,三元运算符 (?:) 允许赋值null 到 int 类型的变量,即使 int 是不支持 null 值的原始数据类型。考虑以下代码片段:
int temp() {
return true ? null : 0;
}
在此代码中,如果计算条件为 true,则三元运算符将 null 分配给变量 temp,否则分配 0。编译器允许此分配而不会发出任何错误。然而,当该方法执行时,它会在运行时抛出 NullPointerException,因为 null 不是 int 的有效值。
与三元运算符相反,if 语句不允许对以下变量进行此类 null 赋值原始类型。例如:
int same() {
if (true) {
return null;
} else {
return 0;
}
}
此代码将生成编译时错误,并显示消息“不兼容的类型:null 无法转换为 int”。造成这种差异的原因在于编译器处理 null 值的方式。
在三元运算符的情况下,编译器将 null 文字解释为对 Integer(int 的包装类)的 null 引用。这是由于自动装箱和拆箱的编译器规则所致:当从基本类型转换为对象类型时,Java 虚拟机 (JVM) 会自动将基本值包装在相应的对象包装器中。
由于 int 是一个原始类型,编译器会尝试对三元运算符返回的 null 值进行拆箱,这会导致 NullPointerException。
另一方面,if 语句不会执行此拆箱过程,并且 null 文字仍然存在作为对象的空引用。由于same()方法的返回类型是int,编译器无法将空引用转换为int,因此会出现编译时错误。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3