这段代码运行良好:-
Integer nullInt = null;
if (1 <= 3) {
Integer secondNull = nullInt;
} else {
Integer secondNull = -1;
}
System.out.println("done");但这会引发空指针异常,同时Eclipse警告需要自动取消装箱:-
Integer nullInt = null;
Integer secondNull = 1 <= 3 ? nullInt : -1;
System.out.println("done");为什么是这样,有人能指点一下吗?
发布于 2020-03-04 11:34:08
三元条件表达式的类型
1 <= 3 ? nullInt : -1是int ( JLS包含几个表,根据第二个和第三个操作数的类型描述三元条件运算符的类型)。
因此,当它试图将nullInt解压缩为int时,会引发一个NullPointerException。
为了获得您的if-else代码段的行为,您需要编写:
1 <= 3 ? nullInt : Integer.valueOf(-1)现在表达式的类型将是Integer,因此不需要取消装箱。
发布于 2020-03-04 11:39:20
我很确定三元操作符的参数必须是相同类型的。由于您使用了-1和一些常量的nullint编译器,所以尝试打开nullint以获得值。然后自动装箱将其存储在secondNull变量中。
发布于 2020-03-04 11:41:49
这是因为当条件运算符? :的两个操作数是基元类型及其装箱引用类型时,将完成取消装箱转换(JLS第15.25.2节):
数值条件表达式的类型确定如下:
通常,用if表达式替换? :语句并不总是保留代码的意义,因为? :表达式本身需要编译时类型。这意味着当两个操作数的类型不同时,必须将其转换为一个或两个操作数,以便结果具有一致的编译时类型。
https://stackoverflow.com/questions/60525084
复制相似问题