为什么这个链式条件运算符抛出npe?

jobtbby3  于 2021-07-07  发布在  Java
关注(0)|答案(1)|浏览(389)
Boolean isTrue = condition1 ? true : (
                                id == null ? null : condition2);

当condition1返回true时,代码运行正常(有意义),但当condition1为false时,代码失败并出现空指针异常。你自己试试-https://www.ideone.com/epj9jd
这有点混乱,没有道理。对此的解释将不胜感激。

xwmevbvl

xwmevbvl1#

Boolean isTrue = condition1 ? true : (
                            id == null ? null /* <- HERE*/ : condition2);

好吧,这有点棘手。问题是由于 null 在标记点引入的值 HERE 打开 Package 。
为什么?
因为 condition1 ? true : ... 是第二个操作数的类型;即 boolean . 因此子表达式 id == null ? null : condition2 哪个是 Boolean 必须解开一个 boolean .
但是打开一个 null 给你一个npe。
很有趣。我本以为这里会有更好的类型推断。
不幸的是,在Java5中,当自动装箱/取消装箱被添加到语言中时,涉及装箱类型的条件表达式的类型规则被固化了。那是在java获得类型推断的重要支持之前的15年。
一旦规则被固化,它们就不能被改变。。。不破坏向后兼容性。
(但实际上这不是一个类型推断问题。打字很好。这里真正的问题是有两种可能的语义,一种涉及拆箱 null 另一个没有。键入条件的jls规则意味着在本例中使用第一个条件。)

相关问题