带和不带 () 的条件运算符
Posted
技术标签:
【中文标题】带和不带 () 的条件运算符【英文标题】:Conditional Operator with and without () 【发布时间】:2012-03-09 00:45:51 【问题描述】:当我想打印我的一个对象(这显然不是空的)时,我遇到了一些奇怪的事情。
如果我使用这条线:
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。
如果有人向我解释一下,为什么在这种情况下必须使用 ()
标记,我将不胜感激。
【问题讨论】:
运算符优先级的情况? 提示:"\n [ITEM ID]: " + item
变成...?
【参考方案1】:
"\n [ITEM ID]: "
和 item
之间的连接将优先于相等测试和条件运算符,如果你不放括号(参见 Java 运算符中的 precedences),所以如果你必须把它们放在你希望它工作(因为("\n [ITEM ID]: " + item) == null
可能不是你想要评估的)。
【讨论】:
谢谢。两个完美的答案,我不知道哪个接受。但我认为我应该接受第一个,但非常感谢 talnicolas!这就是我需要的括号... @czupe 好吧,我实际上是第一个回答的,但无论如何都欢迎你 ;) 好的。如果您是第一个,并评估您编写了 == vs + 运算符,我认为您赢得了我的接受。再次感谢。祝你有美好的一天......【参考方案2】:+
运算符的优先级高于? :
,因此您确实需要使用括号。见http://bmanolov.free.fr/javaoperators.php
【讨论】:
在这种情况下,优先级高于==
。
是的,更珍贵的是连接运算符的优先级高于 == (并且条件运算符无关紧要),我明白......以上是关于带和不带 () 的条件运算符的主要内容,如果未能解决你的问题,请参考以下文章