我有以下简单代码
Exception Value: No module named 'sage.all'
投掷NPE。你知道触发这个NPE的JVM / JDK机制是什么而不仅仅是返回false吗?我必须说我没看过字节码。
答案 0 :(得分:2)
Boolean b = null;
if(b){....}
此条件需要取消装箱Boolean
才能获得boolean
。
if(b.booleanValue() == true)
它基本上是使用Boolean.booleanValue
来提供NullPointerException
。
您可以使用
阻止此操作Boolean b = null;
if(Boolean.TRUE.equals(b)){ //NPE safe
System.out.println(bool);
}
但这有点冗长。
小心,你没有2个状态(真/假)但是3(真/假/空)所以你可以有类似的东西
if(Boolean.TRUE.equals(b)){
System.out.println("true);
} else if(Boolean.FALSE.equals(b)){
System.out.println("false");
} else {
System.out.println("null");
}
您也可以使用Optional
一个快速而肮脏的例子:
Optional.ofNullable(b).ifPresent(bool -> {
System.out.println(bool);
});
答案 1 :(得分:1)
if
语句需要boolean
。 boolean
只能是true
或false
,不允许null
,因为它是原始数据类型而不是Object
但是有自动拳击。这是一种Java自动将原语转换为包装器对象的技术,所以
boolean <-> Boolean
int <-> Integer
double <-> Double
...
随时需要。
由于这些包装器对象是Object
s,null
是它们的可能值。所以,如果你写
Boolean b = null;
if (b) { ... }
Java知道您正在传递Boolean
对象并尝试将其自动解包到其boolean
表示中。因此,它调用方法Boolean#booleanValue
(documentation)。所以你的代码转换成类似
if (b.booleanValue()) { ... }
在评估此语句时,您尝试在null
的某个内容上调用方法。这是不可能的,并且正确抛出NullPointerException
。