由jdk自动装箱,拆箱所引起的nullPointerException

前提:区分:Integer.getInteger和Integer.valueOf : https://www.cnblogs.com/zl1991/p/6669582.html

   Integer.getInteger(String)的功能是根据指定的名称得到系统属性的整数值。第一个参数将被认为是系统属性的名称。系统属性可以通过 System.getProperty(java.lang.String)方法访问得到。属性值字符串将被解释成一个整数,并且以表示这个值的Integer对象形式返回。可能出现的数字格式的详细说明可以在 getProperty 的定义说明里找到。

    Integer.valueOf(String)的功能是获取给定的字符串所代表的整数。

如图:报空指针异常:

由jdk自动装箱,拆箱所引起的nullPointerException_第1张图片

相关代码如下:

public static void main(String[] args) {
    Map piTypeStatusMap = new HashMap();
    piTypeStatusMap.put("wx",1);
    System.out.println(1 == piTypeStatusMap.get("jd") );
}

    由于在比较时,  piTypeStatusMap.get("jd") 并且进行1 == piTypeStatusMap.get("jd")比较时,使用自动拆箱功能:piTypeStatusMap.get("jd").intValue() 所以会报空指针异常

JDK1.5的自动装箱与拆箱 请参阅:https://www.cnblogs.com/visionit/p/4160162.html

内容如下:

今天偶然间发现项目里Integer类型的变量用“==”进行比较的,但是却一直没出现问题。所以就上网查了查,发现这里面涉及到JDK1.5的新特性。

1.Java中的数据类型,可分为两类:

a.基本数据类型,也称原始数据类型。short,char,int,long,float,double,boolean,byte

  用“==”进行比较。

b.引用数据类型(类)

  比较引用类型变量值的时候,需要调用equals()方法,当他们用“==”进行比较的时候,比较的是他们在内存中的存放地址。

2.先运行这段代码

复制代码
 1 public class TestClass { 
 2     public static void main(String[] args) {
 3         Integer a=10;
 4         Integer b=10;
 5         Integer c=200;
 6         Integer d=200;
 7         System.out.println("a==b:"+(a==b));
 8         System.out.println("c==d:"+(c==d));
 9     }
10 }
复制代码

结果为:

1 a==b:true
2 c==d:false

结果分析:为什么两次的结果不一样呢?后来去网上查阅了一下资料,Integer a=10,实际上执行了Integer a=Integer.valueOf(10)装箱操作而在自动装箱时对于从–128到127之间的值,它们被装箱为Integer对象后,会存在内存中被重用(这里面涉及到一种设计模式,叫享元模式),也就是说,其实此时a和b在内存中的地址是一样的,所以结果为true,而c和d的值大于127,他们在内存中的地址不会被共享,结果false.

3.再来看看自动拆箱,其实自动拆箱很简单,我们平时用的比较多,只是概念不清晰。

复制代码
1 public class TestClass { 
2     public static void main(String[] args) {
3         Integer a=new Integer(200);
4         int b=200;
5         System.out.println("a==b:"+(a==b));
6     }
7 }
复制代码

当Integer类型数据作运算的时候系统就会自动执行了拆箱过程a.intValue(),再进行运算。

注:自动拆箱和装箱是JDK1.5版本新加的特性,所以之前的版本并不支持。




你可能感兴趣的:(Java基础)