代码: -
Integer value =null;
int a = value;
输出: -
Exception in thread "main" java.lang.NullPointerException
我理解拆箱失败,因为null引用没有int值。但是任何人都可以告诉我调用的方法导致nullPointerException
答案 0 :(得分:4)
在将引用类型Integer
分配给相应的基元类型int
时,会发生取消装箱转换。它在jls-5.1.8 Unboxing Conversion:
如果r是Integer类型的引用,则取消装箱转换会转换 r进入r.intValue()
因此,当您尝试将其取消装箱时,value.intValue()
会调用NPE,因为value
为null
答案 1 :(得分:2)
首先,您必须了解您拥有的代码实际上已编译为略有不同的代码。
[s_delima@ml-l-sotiriosd bin]$ /usr/java/latest/bin/javap -c Test.class
Compiled from "Test.java"
public class Test {
...
public static void main(java.lang.String[]) throws java.io.IOException;
Code:
0: aconst_null
1: astore_1
2: aload_1
3: invokevirtual #19 // Method java/lang/Integer.intValue:()I
6: istore_2
7: return
}
您会注意到java/lang/Integer.intValue()
的调用。由于您的Integer
变量引用了null
,因此当调用尝试取消引用时,您将获得NullPointerException
。