今天遇到了一个很奇葩的错误,大致现象如下:
Integer unfinishedQty = (()) - 0;
程序中有一行类似于这样的代码,报了个“空指针异常”,我还问了老同事,valueOf不是不会报空指针么?同事说不会,就算报异常,也应该会报 ,数字转换异常。可是,这一行确实报了空指针,但是有一点我可以肯定,obj这个对象肯定是不为null的,不然走不到这一行,原因我就不多说了。
后来经过多种调试(当时以为传入valueOf中的参数是字符串类型的),调试如下:
public static void main(String[] args) {
((null));
}
报;
然后又试了试,以为可能得给参数一个变量,于是有了如下测试:
public static void main(String[] args) {
String a = null;
((a));
}
还是报;
就是不报空指针;后来经过查看,发现代码中传入的参数是Integer类型的,于是不死心,又试了一下:
public static void main(String[] args) {
Integer a = null;
((a));
}
入参为String类型:
public static Integer valueOf(String s) throws NumberFormatException
{
return new Integer(parseInt(s, 10));
}
入参为int类型:
public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { // must cache
return [i + offset];
}
return new Integer(i);
}
我的代码中调用的为int类型入参的valueOf,而我传参穿的为Integer类型的,在真正调用该方法前,编译时会自动将Integer拆箱成Int类型的,而int类型变量值的不能为null,所以在拆箱的过程中,报了空指针异常。
这个问题我也真是费解了半天呀。希望对大家有所帮助,如果哪里不太正确,欢迎纠错。