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
,将发生以下情况。
-
Java编译器会说“啊!我有一个
Integer
值,我需要将它转换为int
值。我会输出代码来取消它!” 。 -
取消装箱值的代码是对
Integer.intValue()
的调用,使用要取消装箱的值作为目标对象。 除了值为null
…不是真正的对象引用。 -
在运行时,您最终在
null
上调用intValue()
,并抛出NPE。
一些编译器会发出警告,说代码总是抛出一个NPE。 但是,这是合法的Java代码,因此符合标准的Java编译器不能将其称为编译错误。
可能的解决方案:
-
不要使用
(Integer) null
作为参数。 传递int
值或实际(非null)Integer
对象。 在这种情况下,零看起来像一个合理的替代品。 -
将forms参数的类型从
int
更改为Integer
…并将更改传播到返回,使用等对应字段值的位置。
第一种选择可能是正确的,除非你真的需要模拟“参加者”购买了未知数量的门票的可能性。 (如果你确实需要对其进行建模,那么你的应用程序必须以某种方式应对这种可能性。)
是的,你得到一个空指针exception,因为Java会尝试将你的null整数自动装箱到一个int,并且由于不允许使用null int,因此不能正常工作:)(因为你已经尝试过了,我认为id给出了一个explenation为什么你看到这个行为)
int tickets_purchased = (Integer)null;
这在java中是不允许的。
你可以使用Integer tickets_purchased = (Integer)null;