【发布时间】:2014-06-19 07:12:52
【问题描述】:
我写了一些代码;这里是相关的sn-ps:
@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 为空。我已经编写了一些单元测试并使用下面的代码得到了一个空指针异常:
[....]
Score<Float, String> score = new Score<>(0.0f);
Score<Float, String> anotherScore = new Score<>(1.0f, "One");
[....]
assertFalse(score.equals(anotherScore));
如果我没记错的话,在equals 中的捷径不应该阻止&& 之后的任何东西被执行,因为第一个表达式已经是false?此外,为什么会有例外?由于条件为真,我希望评估三元表达式并跳过条件表达式。根据我在规范中阅读的内容,这应该是行为。此外,我发现了这个问题:Java ternary (immediate if) evaluation,这应该会为我的思考过程提供更多的筹码。
也许我忽略了一些相当明显的事情,但我没有想法。也许你能帮忙?
【问题讨论】:
标签: java nullpointerexception ternary-operator