NullPointerException с получателем на Long, но не с BigDecimal
Это мой первый вопрос после многих лет использования этого замечательного форума и, следовательно, в первый раз я не нашел ответа на свой вопрос:(
Я получаю странное поведение, работая с BigDecimal
а также Long
: для первого я не получаю NullPointerException
но я делаю со вторым.
Мой код выглядит следующим образом:
if (aggregate != null) {
existingAggregates.setAmtExpect((aggregate.getAmtRecv());
existingAggregates.setNbTrxExpect(aggregate.getNbTrxRecv());
}
Там, где aggregate и существующие Aggregates имеют одинаковый тип объекта Aggregate (я сократил исходный класс, но на самом деле это сущность Hibernate (если нужна полная версия, держите меня в курсе:)
public class Aggregate implements Serializable {
private BigDecimal amtExpect;
private Long nbTrxExpect;
public BigDecimal getAmtExpect() {
return amtExpect;
}
public void setAmtExpect(BigDecimal amtExpect) {
this.amtExpect = amtExpect;
}
public Long getNbTrxExpect() {
return nbTrxExpect;
}
public void setNbTrxExpect(Long nbTrxExpect) {
this.nbTrxExpect = nbTrxExpect;
}
}
Моя проблема возникает, когда агрегат не является нулевым, но когда два члена amtExpect
а также nbTrxExpect
являются нулевыми
Все хорошо с getAmtRecv()
но NullPointerException
брошен с getNbTrxRecv()
,
Я бы понял, если бы оба бросили NPE, но я действительно не понимаю, почему это происходит только с длинным членом: s
Я искал форум, но не мог найти хорошего объяснения для меня. Это из-за автобокса или что-то в этом роде? Я потерялся...
В любом случае, чтобы запустить этот код, я изменил его, как показано ниже:
if (aggregate != null) {
existingAggregates.setAmtExpect((aggregate.getAmtRecv() != null) ? aggregate.getAmtRecv() : BigDecimal.ZERO);
existingAggregates.setNbTrxExpect((aggregate.getNbTrxRecv() != null) ? aggregate.getNbTrxRecv() : BigDecimal.ZERO.longValue());
}
Это работает, но я все еще не понимаю, что происходит с первой версией моего кода.
Большое спасибо,
Noshitheel