Java:构造函数中的NULL

请问这个问题有点理论,但我想理解。

为什么我将null参数传递给构造函数我是否会得到NullPointerException

这是我的榜样

 new AttendeeDetail("Gus Goose","1151","15-01-2012",(Integer) null,null) 

这是class级:

 public class AttendeeDetail { private String ticketholder_name; private String user_id; private String date_of_birth; private int tickets_purchased; private ArrayList tickets; public AttendeeDetail(String ticketholder_name, String user_id, String date_of_birth, int tickets_purchased, ArrayList tickets) { this.ticketholder_name=ticketholder_name; this.user_id=user_id; this.date_of_birth=date_of_birth; this.tickets_purchased=tickets_purchased; this.tickets=tickets; } } 

int不能为null 。 如果确实需要传递空值,请使用Integer类型

请考虑以下代码:

 public class Main { public static void main(String[] args) { Integer wrapped = null; int primitive = wrapped; } } 

现在,让我们看看这段代码使用javap编译的内容:

 public static void main(java.lang.String[]); Code: 0: aconst_null 1: astore_1 2: aload_1 3: invokevirtual #2 // Method java/lang/Integer.intValue:()I 6: istore_2 7: return 

如您所见,为了取消对Integer取消,它尝试在null引用上调用Integer#intValue()方法,因此它会抛出NullPointerException

您将一个Integer(Integer) null分配给一个int参数: int tickets_purchased

Integer ,作为引用类型可以为null ,但int作为基本类型,因此在尝试转换期间会发生错误。

此转换称为拆箱操作 。

正如其他答案所提到的,问题是这个 – (Integer) null

当方法参数的forms类型为int并且您尝试传递(Integer) null ,将发生以下情况。

  1. Java编译器会说“啊!我有一个Integer值,我需要将它转换为int值。我会输出代码来取消它!”

  2. 取消装箱值的代码是对Integer.intValue()的调用,使用要取消装箱的值作为目标对象。 除了值为null …不是真正的对象引用。

  3. 在运行时,您最终在null上调用intValue() ,并抛出NPE。

一些编译器会发出警告,说代码总是抛出一个NPE。 但是,这是合法的Java代码,因此符合标准的Java编译器不能将其称为编译错误。


可能的解决方案:

  1. 不要使用(Integer) null作为参数。 传递int值或实际(非null) Integer对象。 在这种情况下,零看起来像一个合理的替代品。

  2. 将forms参数的类型从int更改为Integer …并将更改传播到返回,使用等对应字段值的位置。

第一种选择可能是正确的,除非你真的需要模拟“参加者”购买了未知数量的门票的可能性。 (如果你确实需要对其进行建模,那么你的应用程序必须以某种方式应对这种可能性。)

是的,你得到一个空指针exception,因为Java会尝试将你的null整数自动装箱到一个int,并且由于不允许使用null int,因此不能正常工作:)(因为你已经尝试过了,我认为id给出了一个explenation为什么你看到这个行为)

int tickets_purchased = (Integer)null; 这在java中是不允许的。

你可以使用Integer tickets_purchased = (Integer)null;