Тернарный оператор для проверки Bigdecimal null - PullRequest
0 голосов
/ 22 октября 2018

Почему я получаю исключение нулевого указателя в этом коде?

    BigDecimal test = null;
    String data = "";
    try {
    System.out.println(test==null?"":test.toString());
    data = test==null?"":test.toString();
    System.out.println(data);
    data = data +  " " + test==null?"":test.toString(); // catching null pointer in this line
    } catch (Exception e) {
        // TODO: handle exception
        e.printStackTrace();
    }

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Начиная с Java 8, существует также альтернативный способ работы с потенциальными ссылками null: Optional

Чтобы предотвратить NPE при преобразовании BigDecimal в String, вы можете использовать Optional вот так:

String data = Optional.ofNullable(test).map(BigDecimal::toString).orElse("");

Таким образом, вам не нужно проверять test несколько раз, если оно null.Имея test один раз завернутый в Optional, вы можете работать над безопасностью, что любое преобразование (map) будет выполнено, только если test не ссылается на null.

0 голосов
/ 22 октября 2018

Он вычисляет выражения как:

data = (data +  " " + test==null)?"":test.toString();

, поэтому, поскольку data + " " + test не null, он пытается вызвать test.toString(), даже если test равно null.

Изменить

data = data +  " " + test==null?"":test.toString();

на

data = data +  " " + (test==null?"":test.toString());
...