请问这个问题有点理论化,但我想理解它。
为什么我将null参数传递给构造函数?我得到NullPointerException
?
这是我的例子
new AttendeeDetail("Gus Goose","1151","15-01-2012",(Integer) null,null)
这是班级:
public class AttendeeDetail {
private String ticketholder_name;
private String user_id;
private String date_of_birth;
private int tickets_purchased;
private ArrayList<Ticket> tickets;
public AttendeeDetail(String ticketholder_name, String user_id,
String date_of_birth, int tickets_purchased, ArrayList<Ticket> 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;
}
}
答案 0 :(得分:6)
int
不能是null
。
如果您确实需要传递空值,请使用Integer
类型
答案 1 :(得分:6)
您已将Integer
:(Integer) null
分配给int
参数:int tickets_purchased
。
Integer
,作为引用类型可以是null
,但int
不能作为基本类型,因此在转换尝试期间会发生错误。
此转化称为unboxing operation。
答案 2 :(得分:6)
请考虑以下代码:
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
。
答案 3 :(得分:5)
正如其他答案所提到的,问题是这个 - (Integer) null
。
当方法参数的正式类型为int
并且您尝试传递(Integer) null
时,将发生以下情况。
Java编译器会说“啊!我有一个Integer
值,我需要将它转换为int
值。我会将代码输出到< strong> unbox it!“。
取消装箱值的代码是对Integer.intValue()
的调用,使用要取消装箱的值作为目标对象。除了值null
...不是真正的对象引用。
在运行时,您最终会在intValue()
上调用null
,并且会抛出NPE。
有些编译器会发出警告,说代码总会抛出一个NPE。但是,这是合法的Java代码,因此符合标准的Java编译器不能将其称为编译错误。
可能的解决方案:
请勿使用(Integer) null
作为参数。传递int
值或实际(非空)Integer
对象。在这种情况下,零看起来像是一个合理的替代品。
将形式参数的类型从int
更改为Integer
...并将更改传播到返回,使用等对应字段值的位置。
第一种选择可能是正确的选择,除非您确实需要模拟“与会者”购买未知票数的可能性。 (如果你确实需要对其进行建模,那么你的应用程序必须以某种方式处理这种可能性。)
答案 4 :(得分:4)
是的,你得到一个空指针异常,因为Java会尝试将你的null整数自动装箱到一个int,并且由于不允许使用null int,因此不能正常工作:)(因为你已经尝试过了,我认为id会给出一个explenation为什么你看到这种行为)
答案 5 :(得分:2)
int tickets_purchased = (Integer)null;
这在java中是不允许的。
您可以使用Integer tickets_purchased = (Integer)null;