Java boolean 优先级与三元运算符的比较

标签 java boolean comparator operator-precedence

我发现了一个我完全不理解的与 Java boolean 运算符优先级相关的很好的情况。我知道并通过oracle官方文档验证here那 && 和 ||优先于三元运算符? :

现在我的代码中有一个奇怪的行与此类似

if (a.getItem() != null && a.getItem().getOtherItem() != null?true:a.getItem().getOtherItem().getSomevalue())
{
......
}

我得到的是 a.getItem().getOtherItem() 中的一个很好的 java.lang.NullPointerException,因为 a.getItem() 为 null。我如何解决它,将其封装在括号中

if (a.getItem() != null && (a.getItem().getOtherItem() != null?true:a.getItem().getOtherItem().getSomevalue()))
{
......
}

所以我的问题是,如果我遵循之前链接的官方文档,为什么我会得到 NullPointerException && has precedence against ?: and && is short circuit evaluated(也在一些 questions 中回答)。

最佳答案

您似乎对“更高优先级”的含义感到困惑。让我们用一个简单的例子来解释:

运算符 * 的优先级高于运算符 '+'。这意味着表达式 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() 不为空并且 a.getItem().getOtherItem() 不为空 评估为 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() 不是 nulltruea.getItem() .getOtherItem() is null 应该导致 getSomevalue() 在您刚刚证明是

您最有可能想要做的是评估a.getItem().getOtherItem().getSomevalue() 如果所有值都不为空:

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())

在这种情况下,回退值应该是 true,如

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())

每当您在复合 boolean 表达式中看到 truefalse 时,您就可以确定有问题。

关于Java boolean 优先级与三元运算符的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25619568/

相关文章:

java - 如何监控具有多个服务器/Mule 代理的 Mule 3 ESB 社区版?

java - Java 中的++i+++i+++i 与 C

java - Spring 的 ObjectFactoryCreatingFactoryBean 可以与引用接口(interface)的泛型一起工作吗?

java - 使用 boolean 值搜索数组

Java 使用关联比较器对列表进行排序

java - 哈希表比较器问题

java - 如何从 jmx 客户端访问 dynamicmbean

c++ - 编译器是否应该将 bool 中的任意非零值正确解释为 true?

boolean - SwiftUI:检索和显示 boolean 文字值

algorithm - 排序网络中的比较器列表