Java:构造函数中的NULL

时间:2014-10-06 07:37:59

标签: java constructor nullpointerexception

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

为什么我将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;
    }
}

6 个答案:

答案 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时,将发生以下情况。

  1. Java编译器会说“啊!我有一个Integer值,我需要将它转换为int值。我会将代码输出到< strong> unbox it!“

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

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

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


    可能的解决方案:

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

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

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

答案 4 :(得分:4)

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

答案 5 :(得分:2)

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

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