【发布时间】:2025-11-22 15:10:01
【问题描述】:
几天前,我遇到了一个令人着迷的场景,我找不到任何关于 Java 如何或为什么会发生以下情况的文档。 (这个 sn-p 只是 bug 的简化形式。)
@Test
public void test() {
boolean bool = false;
Integer intVal = Integer.valueOf(5);
Long longVal = null;
Long result = bool ? intVal : longVal;
System.out.println(" > " + result);
}
在上面的sn-p中:
如果 bool = true,则得到值 '5';
但如果 bool = false,则在尝试评估三元运算时会出现空指针异常。不是打印语句。
要解决这个问题,我只需将“结果”更改为
Long result = bool ? Long.valueOf(intVal) : longVal;
这样做会得到我需要的预期行为:
如果 bool = true,则得到值 '5';
但如果 bool = false,那么你会得到 'null'
现在有趣的部分是,如果你把它拆分成一个普通的 if/else 语句,那么 java 不会让你编译
longVal = intVal;
但它没有通过三元运算符捕捉到这一点。那么 Java 做了什么来使它在原始的 sn-p 中成为 null 点呢?
(java 11)
【问题讨论】:
标签: java nullpointerexception conditional-operator