Опционально и кастинг одновременно - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть BigDecimal сумма, которую я хочу разыграть до Long, если это не null, но я получил исключение java.lang.NullPointerException, которое делает:

BigDecimal bgAmount = getAmount();

long totalSupplyFilterMin = 
              Optional.ofNullable(bgAmount.longValue()).orElse(Long.MIN_VALUE);

Ответы [ 5 ]

0 голосов
/ 09 декабря 2018

Обычно у нас есть шаблон для этого в нашей кодовой базе, что-то вроде приведенного ниже кода, но он не сильно отличается от ответа Макото в этом случае:

long totalSupplyFilterMin = Long.MIN_VALUE;
BigDecimal bgAmount;
if ((bgAmount = getAmount()) != null) {
     totalSupplyFilterMin = bgAmount.longValue();
}

Единственныйразница в числе раз, когда вы читаете переменную bgAmount, этот код читает его один раз, а не дважды в приведенном выше ответе (это крайне редко важно, если когда-либо - но я приобрел привычкунаписание кода, как это).

0 голосов
/ 09 декабря 2018

Если bgAmount равно null, вызов longValue приведет к NullPointerException.Обратите внимание, что это не имеет ничего общего с дополнительным, так как он вызывается еще до того, как вы примените дополнительный.

Вместо этого вы можете позвонить map, чтобы безопасно применить это преобразование:

long totalSupplyFilterMin = 
     Optional.ofNullable(bgAmount).map(BigDecimal::longValue).orElse(Long.MIN_VALUE);
0 голосов
/ 09 декабря 2018

кажется, bgAmount равно нулю, поэтому при вызове bgAmount.longValue() возникает исключение.

long totalSupplyFilterMin = Optional.ofNullable(bgAmount.longValue())
                                    .orElse(Long.MIN_VALUE);

Кстати, не используйте ofNullable здесь, так как bgAmount.longValue() никогда не будет нулевым.

Вы, вероятно, хотели сделать:

Optional.ofNullable(bgAmount).map(s -> s.longValue()).orElse(Long.MIN_VALUE);
0 голосов
/ 09 декабря 2018

Не ... используйте Optional для пустой проверки.Просто явно проверьте null и , затем разыменуйте объект, если он не нулевой.

BigDecimal bgAmount = getAmount();
long totalSupplyFilterMin = Long.MIN_VALUE;
if(bgAmount != null) {
    totalSupplyFilterMin = bgAmount.longValue();
}

Вы используете Optional как return значение, указывающее на отсутствие значения. Это , а не замена нулевой проверки.

0 голосов
/ 09 декабря 2018

Прежде всего вы неправильно используете Optional.Когда bgAmount == null, то Optional.ofNullable(bgAmount.longValue()) выбрасывает NPE.Правильное использование:

Optional.ofNullable(bgAmount)
        .orElse(BigDecimal.valueOf(Long.MIN_VALUE))
        .longValue();

или

Optional.ofNullable(bgAmount)
                   .map(BigDecimal::longValue)
                   .orElse(Long.MIN_VALUE);
...