奇怪的 Java 赋值时的三元行为。 Java 在幕后做了什么让这一切发生?
Odd Java ternary behavior when assigning value. What is Java doing behind the scenes for this to happen?
几天前,我 运行 遇到了一个令人着迷的场景,我找不到任何文档来说明 Java 如何或为什么会发生以下情况。 (此片段只是错误的简化形式。)
@Test
public void test() {
boolean bool = false;
Integer intVal = Integer.valueOf(5);
Long longVal = null;
Long result = bool ? intVal : longVal;
System.out.println(" > " + result);
}
在上面的代码片段中:
如果 bool = true,则得到值“5”;
但如果 bool = false,则在尝试评估三元运算时会出现空指针异常。不是打印语句。
为了解决这个问题,我只是将 'result' 更改为
Long result = bool ? Long.valueOf(intVal) : longVal;
这样做,将产生我需要的预期行为:
如果 bool = true,则得到值“5”;
但是如果 bool = false,那么你会得到 'null'
现在有趣的是,如果你把它拆分成一个普通的 if/else 语句,那么 java 不会让你编译
longVal = intVal;
但它没有通过三元运算符捕捉到它。那么 Java 做了什么让它在原始片段中成为空点?
(java11)
当你这样做时:
Long result = bool ? intVal : longVal
此表达式返回一个 long
,当 bool
为假时,它会尝试将 null
拆箱为 Long 值以适应 result
变量并抛出一个NPE.
当你这样做时:
Long result = bool ? Long.valueOf(intVal) : longVal
此表达式已返回 Long
,因此无需拆箱,null
值已成功分配给 result
变量。
参考:
如评论部分所述,为了更好地理解为什么会发生这种情况,请查看 JLS 的以下部分:
- Section 5.6.2:二进制数值提升
- Section 15.25: 条件运算符 ? :
几天前,我 运行 遇到了一个令人着迷的场景,我找不到任何文档来说明 Java 如何或为什么会发生以下情况。 (此片段只是错误的简化形式。)
@Test
public void test() {
boolean bool = false;
Integer intVal = Integer.valueOf(5);
Long longVal = null;
Long result = bool ? intVal : longVal;
System.out.println(" > " + result);
}
在上面的代码片段中:
如果 bool = true,则得到值“5”;
但如果 bool = false,则在尝试评估三元运算时会出现空指针异常。不是打印语句。
为了解决这个问题,我只是将 'result' 更改为
Long result = bool ? Long.valueOf(intVal) : longVal;
这样做,将产生我需要的预期行为:
如果 bool = true,则得到值“5”;
但是如果 bool = false,那么你会得到 'null'
现在有趣的是,如果你把它拆分成一个普通的 if/else 语句,那么 java 不会让你编译
longVal = intVal;
但它没有通过三元运算符捕捉到它。那么 Java 做了什么让它在原始片段中成为空点?
(java11)
当你这样做时:
Long result = bool ? intVal : longVal
此表达式返回一个 long
,当 bool
为假时,它会尝试将 null
拆箱为 Long 值以适应 result
变量并抛出一个NPE.
当你这样做时:
Long result = bool ? Long.valueOf(intVal) : longVal
此表达式已返回 Long
,因此无需拆箱,null
值已成功分配给 result
变量。
参考:
如评论部分所述,为了更好地理解为什么会发生这种情况,请查看 JLS 的以下部分:
- Section 5.6.2:二进制数值提升
- Section 15.25: 条件运算符 ? :