看来你对“更高优先级”的含义感到困惑.让我们用一个简单的例子来解释:
运算符*的优先级高于运算符”.这意味着表达式a * b c的评估类似于(a * b)c.这同样适用于&&运算符和三元运算符:
&安培;&安培;优先级高于运算符? :.这意味着表达式a&& b?c:d被评估为(a&& b)?c:d.
因此,运算符优先级的工作方式与示例中记录的相同.它完全符合您的要求:
if (a.getItem() != null && a.getItem().getOtherItem() != null?
true:a.getItem().getOtherItem().getSomevalue())
如果a.getItem()不为null且a.getItem().getOtherItem()不为null,则为true,否则为a.getItem().getOtherItem().getSomevalue().因此,当其中任何一个值为null时,代码将尝试计算将产生NullPointerException的第三个术语.
目前尚不清楚你真正想要实现的目标.在你的第二个例子中,你说:
if (a.getItem() != null && (a.getItem().getOtherItem() != null?
true: a.getItem().getOtherItem().getSomevalue()))
所以你想要解释a.getItem()为null时为false的情况,但是在括号中你要求解释a.getItem().getOtherItem()不为null时的情况,而a.getItem是这样的情况().getOtherItem()为null应该导致在您刚刚证明为null的引用上调用getSomevalue().
您最可能想要做的是评估a.getItem().getOtherItem().getSomevalue()如果所有值都不为null:
if (a.getItem() != null && a.getItem().getOtherItem() != null?
a.getItem().getOtherItem().getSomevalue(): false)
请注意,您可以在没有三元运算符的情况下表达相同的内容.等同的陈述是:
if (a.getItem() != null && a.getItem().getOtherItem() != null
&& a.getItem().getOtherItem().getSomevalue())
在这种情况下,回落值应该像在里面一样真实
if (a.getItem() != null && a.getItem().getOtherItem() != null?
a.getItem().getOtherItem().getSomevalue(): true)
同样可以表示为
if (a.getItem() == null || a.getItem().getOtherItem() == null
|| a.getItem().getOtherItem().getSomevalue())
无论何时在复合布尔表达式中看到true或false,都可以确定存在错误.