为什么if(null)抛出NullPointerException

时间:2018-04-26 09:49:51

标签: java

我有以下简单代码

  Exception Value: No module named 'sage.all'

投掷NPE。你知道触发这个NPE的JVM / JDK机制是什么而不仅仅是返回false吗?我必须说我没看过字节码。

2 个答案:

答案 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语句需要booleanboolean只能是truefalse,不允许null,因为它是原始数据类型而不是Object

但是有自动拳击。这是一种Java自动将原语转换为包装器对象的技术,所以

boolean <-> Boolean
int     <-> Integer
double  <-> Double
...

随时需要。

由于这些包装器对象是Object s,null是它们的可能值。所以,如果你写

Boolean b = null;
if (b) { ... }

Java知道您正在传递Boolean对象并尝试将其自动解包到其boolean表示中。因此,它调用方法Boolean#booleanValuedocumentation)。所以你的代码转换成类似

的东西
if (b.booleanValue()) { ... }

在评估此语句时,您尝试在null的某个内容上调用方法。这是不可能的,并且正确抛出NullPointerException