问题
Please I have this question which is a bit theoretical, but I would like to understand it.
Why if I pass a null argument to a constructor do I get a NullPointerException
?
This is my example
new AttendeeDetail("Gus Goose","1151","15-01-2012",(Integer) null,null)
This is the class:
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;
}
}
回答1:
an int
can't be null
.
If you really need to pass a null value, use the Integer
type
回答2:
Consider the following code:
public class Main {
public static void main(String[] args) {
Integer wrapped = null;
int primitive = wrapped;
}
}
Now, let's see what this code compiles to by using 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
As you can see, in order to unbox the Integer
it tries to invoke Integer#intValue() method on null
reference, and therefore it throws NullPointerException
.
回答3:
You're assigning an Integer
: (Integer) null
to an int
parameter: int tickets_purchased
.
Integer
, as a reference type can be null
, but int
as a primitive type cannot be, so an error occurs during the attempt to convert.
This conversion is called an unboxing operation.
回答4:
As other answers mention, the problem is this - (Integer) null
.
When the formal type of a method argument is int
and you try to pass (Integer) null
, the following is going to happen.
The Java compiler is going to say "Ah! I have an
Integer
value, and I need to convert it to anint
value. I will output code to unbox it!".The code to unbox the value is a call to
Integer.intValue()
, using the value-to-be-unboxed as the target object. Except that the value isnull
... not a real object reference.At runtime, you end up calling
intValue()
on thenull
, and that throws an NPE.
Some compilers will issue a warning for this, saying that the code will always throw an NPE. However, this is legal Java code, so a conformant Java compiler cannot call this a compilation error.
Possible solutions:
Don't use
(Integer) null
as the parameter. Pass anint
value, or an actual (not null)Integer
object. In this case, zero looks like a reasonable substitute.Change the type of the formal parameter from
int
toInteger
... and propagate the change to the places where the corresponding field value is returned, used, etcetera.
The first alternative is probably the correct one, unless you really need to model the possibility that an "attendee" has purchased an unknown number of tickets. (And if you do need to model that, then your application has to cope with this possibility ... somehow.)
回答5:
Yes, you get a null pointer exception because Java will try to autobox your null Integer to an int, and that wont work since null ints are not allowed :) (since you already tried it out i thought id give an explenation why you see this behaviour)
回答6:
int tickets_purchased = (Integer)null;
this is not allowed in java.
You can use Integer tickets_purchased = (Integer)null;
来源:https://stackoverflow.com/questions/26211744/java-null-in-constructor