我有以下简单代码
Boolean b = null;
if(b){....}
它正在抛出NPE。您知道触发此NPE而不是仅返回false的JVM/JDK机制是什么?我必须说我没有看过字节码。
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个状态(true/fals(,而是3个(true/fals/null(,因此您可以拥有
之类的东西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);
});
if
语句期望boolean
。boolean
只能是true
或false
,不允许null
,因为它是原始数据类型而不是Object
。
,但是有 auto-boxing 。这是一种技术,Java自动将原语转换为包装对象,所以
boolean <-> Boolean
int <-> Integer
double <-> Double
...
只要需要。
由于这些包装器对象为Object
s,因此null
是它们的可能值。因此,如果您写
Boolean b = null;
if (b) { ... }
java知道您正在传递Boolean
对象,并试图将其自动解开为boolean
表示。因此,它调用方法Boolean#booleanValue
(文档(。因此您的代码被转换为
if (b.booleanValue()) { ... }
评估此语句时,您正在尝试调用null
的方法。这是不可能的,并且正确地抛出了NullPointerException
。