java中三元运算条件判断语句_java-三元运算符在不满足条件的情况下评估条件语句...

我已经写了一些代码;以下是相关片段:

@NonNullByDefault

public class Score

{

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) object).getValue().equals(value) &&

literal == null ? ((Score) object).getLiteral() == null : literal.equals(((Score) object).getLiteral());

}

return false;

}

基本上,想法是分数可能仅具有数字值,在这种情况下文字为null.我已经编写了一些单元测试,并使用以下代码获取了空指针异常:

[....]

Score score = new Score<>(0.0f);

Score anotherScore = new Score<>(1.0f, "One");

[....]

assertFalse(score.equals(anotherScore));

如果我没记错的话,在&&之后,不应简捷地等于从被执行为第一个表达式已经是假的?此外,为什么例外?由于条件为真,因此我希望对三元表达式进行求值,并跳过条件表达式.根据我在规范中阅读的内容,这应该是行为.此外,我发现了一个问题:Java ternary (immediate if) evaluation,应该为我的思考过程提供更多的杠杆作用.

也许我忽略了一些显而易见的事情,但是我没有主意.也许你可以帮忙吗?

解决方法:

它会短路,但是与您想要的方式完全不同. &&优先级高于三元?:-因此(缩进,换行和添加注释以澄清)

((Score) object).getValue().equals(value) &&

literal == null

? ((Score) object).getLiteral() == null

: literal.equals(((Score) object).getLiteral())

实际上意味着:

//the first line as a whole is the condition for ?:

((Score) object).getValue().equals(value) && literal == null

? ((Score) object).getLiteral() == null

: literal.equals(((Score) object).getLiteral())

实际上,这意味着,如果条件的第一部分为false但文字为null,则您将自动输入表达式的:部分,在其中调用literal.equals,从而导致NullPointerException.

修复很简单:添加括号以告诉Java您希望对事物进行哪种评估:

((Score) object).getValue().equals(value) &&

(literal == null

? ((Score) object).getLiteral() == null

: literal.equals(((Score) object).getLiteral()))

标签:nullpointerexception,ternary-operator,java

来源: https://codeday.me/bug/20191121/2054413.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值