Boolean.valueOf()有时会产生NullPointerException?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (31)

我有这样的代码:

package tests;

import java.util.Hashtable;

public class Tests {

    public static void main(String[] args) {

        Hashtable<String, Boolean> modifiedItems = new Hashtable<String, Boolean>();

        System.out.println("TEST 1");
        System.out.println(modifiedItems.get("item1")); // Prints null
        System.out.println("TEST 2");
        System.out.println(modifiedItems.get("item1") == null); // Prints true
        System.out.println("TEST 3");
        System.out.println(Boolean.valueOf(null)); // Prints false
        System.out.println("TEST 4");
        System.out.println(Boolean.valueOf(modifiedItems.get("item1"))); // Produces NullPointerException
        System.out.println("FINISHED!"); // Never executed
    }
}

我的问题是,我不明白为什么测试3工作正常(它打印false和不产生NullPointerException),同时测试4投掷一个NullPointerException。正如你在测试12中看到的,null并且modifiedItems.get("item1")是等于和null

Java 7和8中的行为是相同的。

提问于
用户回答回答于

你必须仔细看看哪些过载被调用:

  • Boolean.valueOf(null)正在调用Boolean.valueOf(String)NPE即使提供了null参数,这也不会抛出。
  • Boolean.valueOf(modifiedItems.get("item1"))正在调用Boolean.valueOf(boolean),因为其modifiedItems值是类型的Boolean,这需要拆箱转换。由于modifiedItems.get("item1")IS null,它是价值的拆箱-不是Boolean.valueOf(...)-它抛出NPE。

确定调用哪个超载的规则非常多,但它们大致如下所示:

  • 在第一遍中,搜索方法匹配而不允许装箱/取消装箱(也不是变量方法)。
    • 因为这null是一个可接受的值,String但不是boolean,在这个过程中Boolean.valueOf(null)相匹配Boolean.valueOf(String);
    • Boolean不是一个可接受的对任一Boolean.valueOf(String)Boolean.valueOf(boolean),所以没有方法在此通作匹配Boolean.valueOf(modifiedItems.get("item1"))

  • 在第二遍中,搜索方法匹配,允许装箱/拆箱(但仍然不是可变的arity方法)。
    • A Boolean可以取消装箱boolean,所以在这个过程中Boolean.valueOf(boolean)相匹配Boolean.valueOf(modifiedItems.get("item1")); 但编译器必须插入拆箱转换才能调用它:Boolean.valueOf(modifiedItems.get("item1").booleanValue())

  • (第三遍允许可变的方法,但在这里没有关系,因为前两个匹配符合这些情况)
用户回答回答于

扫码关注云+社区