想要在取消装箱时知道编译器推断出的内部代码

时间:2013-11-27 20:31:05

标签: java nullpointerexception unboxing

代码: -

Integer value =null;
int a = value;

输出: -

Exception in thread "main" java.lang.NullPointerException

我理解拆箱失败,因为null引用没有int值。但是任何人都可以告诉我调用的方法导致nullPointerException

2 个答案:

答案 0 :(得分:4)

在将引用类型Integer分配给相应的基元类型int时,会发生取消装箱转换。它在jls-5.1.8 Unboxing Conversion

中定义
  

如果r是Integer类型的引用,则取消装箱转换会转换   r进入r.intValue()

因此,当您尝试将其取消装箱时,value.intValue()会调用NPE,因为valuenull

答案 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