为什么在此代码中出现空指针异常?
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();
}
答案 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
)