Boolean isTrue = condition1 ? true : ( id == null ? null : condition2);
当condition1返回true时,代码运行正常(有意义),但当condition1为false时,代码失败并出现空指针异常。你自己试试-https://www.ideone.com/epj9jd这有点混乱,没有道理。对此的解释将不胜感激。
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规则意味着在本例中使用第一个条件。)
null
HERE
condition1 ? true : ...
boolean
id == null ? null : condition2
Boolean
1条答案
按热度按时间xwmevbvl1#
好吧,这有点棘手。问题是由于
null
在标记点引入的值HERE
打开 Package 。为什么?
因为
condition1 ? true : ...
是第二个操作数的类型;即boolean
. 因此子表达式id == null ? null : condition2
哪个是Boolean
必须解开一个boolean
.但是打开一个
null
给你一个npe。很有趣。我本以为这里会有更好的类型推断。
不幸的是,在Java5中,当自动装箱/取消装箱被添加到语言中时,涉及装箱类型的条件表达式的类型规则被固化了。那是在java获得类型推断的重要支持之前的15年。
一旦规则被固化,它们就不能被改变。。。不破坏向后兼容性。
(但实际上这不是一个类型推断问题。打字很好。这里真正的问题是有两种可能的语义,一种涉及拆箱
null
另一个没有。键入条件的jls规则意味着在本例中使用第一个条件。)