有和没有()的条件运算符

时间:2012-02-17 15:47:08

标签: java conditional-operator operator-precedence

当我想要打印我的一个对象(显然不是null)时,我遇到了一些奇怪的事情。

如果我使用这一行:

text.append("\n [ITEM ID]: " + (item == null ? (otherItem == null ? 0 : otherItem .getItems().get(i).getId()) : item .getItems().get(i).getId()));

如果我的item对象为null,则没有空指针异常。当然这应该是例外结果。但如果我在没有()标记的情况下使用它:

text.append("\n [ITEM ID]: " + item == null ? (otherItem == null ? 0 : otherItem .getItems().get(i).getId()) : item .getItems().get(i).getId())

我认为条件运算符不执行运算符的其他部分,但是我得到了NullPointerException。

如果有人向我解释,为什么在这种情况下使用()标记至关重要,我将不胜感激。

2 个答案:

答案 0 :(得分:1)

"\n [ITEM ID]: "item之间的连接将优先于等式测试和条件运算符(如果不放括号)(参见Java运算符中的precedences),所以如果你想让它工作,你必须把它们放在一起(因为("\n [ITEM ID]: " + item) == null可能不是你想要评估的)。

答案 1 :(得分:1)

+运算符的优先级高于? :,因此您需要使用括号。见http://bmanolov.free.fr/javaoperators.php