我在书中看到了这个例子,作者试图告诉我们使用拳击。我在理解最后一行时遇到问题,即“当代码尝试调用doStuff(x)时代码抛出异常,因为x不引用Integer对象。”我不明白为什么x不是Integer Wrapper类的对象。好像,我之前将它定义为静态整数x。这个x变量是不是对Integer Wrapper类的引用? 。而且,它为什么抛出“NullPointerException?”
答案 0 :(得分:7)
我不明白为什么x不是Integer Wrapper类的对象。
由于x
从未初始化,因此它具有默认值:null
。
此外,为什么它会抛出“NullPointerException?”
由于autounboxing is just a method call inserted by the compiler将Integer
变成了int
:它会调用Integer#intValue()
。但是没有实例,所以就像尝试这样做:
Integer x = null;
int someInt = x.intValue();
......这应该是非常明显的。
自动装箱所涉及的步骤,包括此NPE行为,请参阅the JLS § 5.1.8, Unboxing Conversion.快乐阅读!
答案 1 :(得分:4)
当您的代码运行并且您致电doStuff(x)
时,x
为null
,因为您尚未对其进行初始化。编译器将生成调用x.intValue()
的字节代码,以便将int
传递给您的方法。由于x
为null
,您将获得NullPointerException
。
答案 2 :(得分:1)
作为引用类型的整数,类型为Integer
的变量可以包含null
或对Integer
对象的引用。他们只想说如果x
为空,则无法将其转换为int
。