三元运算符,用于Bigdecimal空验证

时间:2018-10-22 08:14:35

标签: java nullpointerexception ternary-operator bigdecimal

为什么在此代码中出现空指针异常?

    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 :(得分:10)

它将表达式的计算方式如下:

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());

答案 1 :(得分:1)

自Java 8起,还有另一种方法可以处理潜在的BigDecimal引用:String

要在将Optional转换为String data = Optional.ofNullable(test).map(BigDecimal::toString).orElse(""); 时防止NPE,可以使用test,如下所示:

null

这样,您无需多次检查test是否为Optional。将map包裹在test中后,您可以安全起见,只有在null未引用offensiveHolder的情况下,才能执行任何转换(.some