java - 三元运算符在条件不满足时评估条件语句

标签 java nullpointerexception ternary-operator

我已经写了一些代码;这里是相关的片段:

@NonNullByDefault
public class Score<NUMERAL, LITERAL>
{
    protected NUMERAL value;
    @Nullable
    protected LITERAL literal;
    [...]

我已经覆盖了我的equals()方法如下:

@Override
public boolean equals(@Nullable Object object)
{
    if(object == null) return false;
    if(object == this) return true;

    if( object instanceof Score)
    {
        return ((Score<NUMERAL, LITERAL>) object).getValue().equals(value) &&
                literal == null ? ((Score<NUMERAL, LITERAL>) object).getLiteral() == null : literal.equals(((Score<NUMERAL, LITERAL>) object).getLiteral());
    }
    return false;
}

基本上,想法是 Score 可能只有一个数值,在这种情况下 literal 为 null。我已经编写了一些单元测试并使用以下代码获得空指针异常:

[....]
Score<Float, String> score = new Score<>(0.0f);
Score<Float, String> anotherScore = new Score<>(1.0f, "One");
[....]

assertFalse(score.equals(anotherScore));

如果我没记错的话,equals 中的快捷方式不应该阻止 && 之后的任何内容被执行,因为第一个表达式已经是 false?此外,为什么异常(exception)?由于条件为真,我希望评估三元表达式并跳过条件表达式。根据我在规范中阅读的内容,这应该是行为。此外,我发现了这个问题:Java ternary (immediate if) evaluation这应该为我的思维过程提供更多的影响力。

也许我忽略了一些相当明显的东西,但我没有想法。也许你能帮忙?

最佳答案

它可以短路,但不是您想要的那样。 && 比三元 ?: 具有更高的优先级 - 因此这(缩进、换行符和注释添加以澄清)

((Score<NUMERAL, LITERAL>) object).getValue().equals(value) &&
literal == null
    ? ((Score<NUMERAL, LITERAL>) object).getLiteral() == null
    : literal.equals(((Score<NUMERAL, LITERAL>) object).getLiteral())

其实是这个意思:

//the first line as a whole is the condition for ?:
((Score<NUMERAL, LITERAL>) object).getValue().equals(value) && literal == null
    ? ((Score<NUMERAL, LITERAL>) object).getLiteral() == null
    : literal.equals(((Score<NUMERAL, LITERAL>) object).getLiteral())

这意味着,在实践中,如果条件的第一部分为 falseliteralnull,您将自动输入 : 表达式的一部分,您调用 literal.equals,导致 NullPointerException

解决方法很简单:添加括号来告诉 Java 您希望以哪种方式计算内容:

((Score<NUMERAL, LITERAL>) object).getValue().equals(value) && 
(literal == null 
    ? ((Score<NUMERAL, LITERAL>) object).getLiteral() == null
    : literal.equals(((Score<NUMERAL, LITERAL>) object).getLiteral()))

关于java - 三元运算符在条件不满足时评估条件语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23430895/

相关文章:

android - 将父 fragment 转换为主 fragment 时出现空指针异常

java - 对因 Profile 而尚未创建的 bean 进行 Null 检查

java - 什么是NullPointerException,我该如何解决?

java - 从字符串中删除 HTML 并在脚本标签内显示要点 - Android

java - 如何在 mysema 框架中使用 SimpleExpression.eqAny?

java - 我可以使用循环来同时水平和垂直移动吗?

vb.net - VB.NET“如果”运算符会导致装箱吗?

java - 在ubuntu 10.10上安装jdk1.7.0

c++ - "warning: operation of ... may be undefined"用于三元运算——不是 if/else block

c++ - C/C++ : How does this inline if get parsed?