Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Boolean.valueOf()有时会生成NullPointerException_Java_Nullpointerexception_Boolean - Fatal编程技术网

Java Boolean.valueOf()有时会生成NullPointerException

Java Boolean.valueOf()有时会生成NullPointerException,java,nullpointerexception,boolean,Java,Nullpointerexception,Boolean,我有以下代码: 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("TES

我有以下代码:

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
    }
}
包测试;
导入java.util.Hashtable;
公开课考试{
公共静态void main(字符串[]args){
Hashtable modifiedItems=新Hashtable();
系统输出打印项次(“测试1”);
System.out.println(modifiedItems.get(“item1”);//打印空值
系统输出打印项次(“测试2”);
System.out.println(modifiedItems.get(“item1”)==null);//打印为true
系统输出打印项次(“测试3”);
System.out.println(Boolean.valueOf(null));//打印错误
系统输出打印项次(“测试4”);
System.out.println(Boolean.valueOf(modifiedItems.get(“item1”));//生成NullPointerException
System.out.println(“完成!”;//从未执行
}
}
我的问题是,我不理解为什么测试3工作正常(它打印
false
,并且不产生
NullPointerException
),同时测试4抛出一个
NullPointerException
。正如您在测试1和2中所看到的,
null
modifiedItems.get(“item1”)
是相等的,而
null


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

因为
modifiedItems.get
返回一个
布尔值
(这是不可强制转换为
字符串
),所以将使用的签名是,
布尔值
被装箱为一个基元
布尔值
。返回
null
后,outboxing将失败,出现
NullPointerException

您必须仔细查看调用的重载:

  • Boolean.valueOf(null)
    正在调用。即使提供了null参数,也不会抛出
    NPE
  • Boolean.valueOf(modifiedItems.get(“item1”)
    正在调用,因为
    modifiedItems
    的值属于
    Boolean
    类型,需要进行拆箱转换。由于
    modifiedItems.get(“item1”)
    null
    ,因此引发NPE的是该值的解装箱,而不是
    Boolean.valueOf(…)

确定调用哪个重载的规则如下,但大致如下:

  • 在第一个过程中,搜索方法匹配,而不允许装箱/取消装箱(也不允许变量arity方法)

    • 由于
      null
      字符串
      的可接受值,但不是
      布尔值
      boolean.valueOf(null)
      与本过程中的
      boolean.valueOf(String)
      匹配
    • Boolean
      对于
      Boolean.valueOf(String)
      Boolean.valueOf(Boolean)
      都是不可接受的,因此在此过程中没有与
      Boolean.valueOf(modifiedItems.get(“item1”)
      匹配的方法
  • 在第二个过程中,搜索方法匹配,允许装箱/取消装箱(但仍然不允许变量arity方法)

    • Boolean
      可以取消绑定为
      Boolean
      ,因此
      Boolean.valueOf(Boolean)
      在此过程中与
      Boolean.valueOf(modifiedItems.get(“item1”)
      匹配;但是编译器必须插入取消装箱转换才能调用它:
      Boolean.valueOf(modifiedItems.get(“item1”).booleanValue())
  • (第三个过程允许使用可变算术方法,但这与这里无关,因为前两个过程与这些情况相匹配)

方法签名 方法
Boolean.valueOf(…)
有两个签名:

  • 公共静态布尔值(布尔b)
  • 公共静态布尔值(字符串s)
  • 您的
    modifiedItems
    值是
    Boolean
    。您不能将
    布尔值
    强制转换为
    字符串
    ,因此将选择第一个签名

    布尔解装箱 在你的声明中

    Boolean.valueOf(modifiedItems.get("item1"))
    
    可以理解为

    Boolean.valueOf(modifiedItems.get("item1").booleanValue())   
    
    但是,
    modifiedItems.get(“item1”)
    返回
    null
    ,因此基本上

    null.booleanValue()
    

    这显然导致了
    NullPointerException
    ,因为Andy已经很好地描述了
    NullPointerException
    的原因:

    这是由于布尔非装箱:

    Boolean.valueOf(modifiedItems.get("item1"))
    
    转换为:

    Boolean.valueOf(modifiedItems.get("item1").booleanValue())
    
    在运行时,如果
    modifiedItems.get(“item1”)
    为null,则抛出
    NullPointerException

    现在我想在这里再补充一点,如果下面的类的相应返回对象为null,那么将这些类取消装箱到它们各自的原语中也会产生
    NullPointerException
    exception

  • 字节-字节
  • 字符
  • 浮动-浮动
  • 整数
  • 长长的
  • 短-短
  • 双人-双人
  • 代码如下:

        Hashtable<String, Boolean> modifiedItems1 = new Hashtable<String, Boolean>();
        System.out.println(Boolean.valueOf(modifiedItems1.get("item1")));//Exception in thread "main" java.lang.NullPointerException
    
        Hashtable<String, Byte> modifiedItems2 = new Hashtable<String, Byte>();
        System.out.println(Byte.valueOf(modifiedItems2.get("item1")));//Exception in thread "main" java.lang.NullPointerException
    
        Hashtable<String, Character> modifiedItems3 = new Hashtable<String, Character>();
        System.out.println(Character.valueOf(modifiedItems3.get("item1")));//Exception in thread "main" java.lang.NullPointerException
    
        Hashtable<String, Float> modifiedItems4 = new Hashtable<String, Float>();
        System.out.println(Float.valueOf(modifiedItems4.get("item1")));//Exception in thread "main" java.lang.NullPointerException
    
        Hashtable<String, Integer> modifiedItems5 = new Hashtable<String, Integer>();
        System.out.println(Integer.valueOf(modifiedItems5.get("item1")));//Exception in thread "main" java.lang.NullPointerException
    
        Hashtable<String, Long> modifiedItems6 = new Hashtable<String, Long>();
        System.out.println(Long.valueOf(modifiedItems6.get("item1")));//Exception in thread "main" java.lang.NullPointerException
    
        Hashtable<String, Short> modifiedItems7 = new Hashtable<String, Short>();
        System.out.println(Short.valueOf(modifiedItems7.get("item1")));//Exception in thread "main" java.lang.NullPointerException
    
        Hashtable<String, Double> modifiedItems8 = new Hashtable<String, Double>();
        System.out.println(Double.valueOf(modifiedItems8.get("item1")));//Exception in thread "main" java.lang.NullPointerException
    
    Hashtable modifiedItems1=new Hashtable();
    System.out.println(Boolean.valueOf(modifiedItems1.get(“item1”))//线程“main”java.lang.NullPointerException中出现异常
    Hashtable modifiedItems2=新Hashtable();
    System.out.println(Byte.valueOf(modifiedItems2.get(“item1”))//线程“main”java.lang.NullPointerException中出现异常
    Hashtable modifiedItems3=新Hashtable();
    System.out.println(Character.valueOf(modifiedItems3.get(“item1”))//线程“main”java.lang.NullPointerException中出现异常
    Hashtable modifiedItems4=新Hashtable();
    System.out.println(Float.valueOf(modifiedItems4.get(“item1”))//线程“main”java.lang.NullPointerException中出现异常
    Hashtable modifiedItems5=新Hashtable();
    System.out.println(Integer.valueOf(modifiedItems5.get(“item1”))//线程“main”java.lang.NullPointerException中出现异常
    Hashtable modifiedItems6=新Hashtable();
    System.out.println(Long.valueOf(modifiedItems6.get(“item1”))//线程“main”java.lang.NullPointerException中出现异常
    Hashtable modifiedItems7=新Hashtable();
    System.out.println(缩写为valueOf(modifiedItems7.get(“item1”))/