为什么如果(null)抛出NullPoInterException



我有以下简单代码

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语句期望booleanboolean只能是truefalse,不允许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

最新更新