一、问题描述
今天在处理java对象时,getId()方法一直报NullPointerException,但是对象中name属性不是空,所以这个对象也不为空。应该不会报空指针呀。
对象属性如下:
private Integer id;
private String name;
报错行代码:
int id = Obj.getId();
二、问题原因
经过一段时间捣鼓后,突然发现,id属性在我声明时是Integer对象,而我却想将它赋给一个int,那么在Integer转为int拆箱时,感觉会调用Integer中Integer(String s)这个方法,源码如下:
public Integer(String s) throws NumberFormatException {
this.value = parseInt(s, 10);
}
而parseInt(s, 10)这个方法源码如下:
public static int parseInt(String s, int radix)
throws NumberFormatException
{
/*
* WARNING: This method may be invoked early during VM initialization
* before IntegerCache is initialized. Care must be taken to not use
* the valueOf method.
*/
if (s == null) {
throw new NumberFormatException("null");
}
...
}
那么当传入的s == null时应该报NumberFormatException异常
所以在Integer拆箱时应该是调用的其他方法,可是Integer中抛NullPointerException的只有getInteger(String nm, Integer val)这个获取系统参数的方法。
于是在网上找了下
这篇博客描述的比较清楚关于Integer.valueOf(param)报空指针
也就是:在编译时就会自动将Integer拆箱成Int类型的,而int类型变量值的不能为null,所以在拆箱的过程中,报了空指针异常。