Java: NULL в конструкторе
Пожалуйста, у меня есть этот вопрос, который немного теоретический, но я хотел бы понять его.
Почему, если я передаю конструктору аргумент 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 ответов:
An
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, он пытается вызватьInteger#intValue()метод по ссылкеnull, и поэтому он выбрасываетNullPointerException.
Как упоминают другие ответы, проблема заключается в следующем -
(Integer) null.Когда формальным типом аргумента метода является
intи вы пытаетесь передать(Integer) null, произойдет следующее.
Компилятор Java собирается сказать " Ах! У меня есть значение
Integer, и мне нужно преобразовать его в значениеint. Я выведу код на unbox it!".Код для распаковки значения-это вызов
Integer.intValue(), использующий значение для распаковки в качестве цели объект. За исключением того, что значение равноnull... не реальная ссылка на объект.Во время выполнения вы в конечном итоге вызываете
intValue()наnull, и это вызывает NPE.Некоторые компиляторы выдают предупреждение об этом, говоря, что код всегда будет бросать NPE. Однако это законный код Java, поэтому соответствующий компилятор Java не может назвать это ошибкой компиляции.
Возможные решения:
Не используйте
(Integer) nullв качестве параметра. Проходить значениеintили фактический (не нулевой) объектInteger. В этом случае ноль выглядит как разумная замена.Измените тип формального параметра с
intнаInteger... и распространить изменение на те места, где возвращается соответствующее значение поля, используется и т. д.Первая альтернатива, вероятно, правильная, если только вам действительно не нужно моделировать возможность того, что" участник " приобрел неизвестный количество билетов. (И если вам действительно нужно смоделировать это, то ваше приложение должно справиться с этой возможностью ... как-то.)
Да, вы получаете исключение null-указателя, потому что Java попытается автобокс вашего null-целого числа в int, и это не будет работать, так как null-ints не допускаются :) (так как вы уже пробовали это, я думал, что id даст объяснение, почему вы видите такое поведение)
int tickets_purchased = (Integer)null;это запрещено в java.Вы можете использовать
Integer tickets_purchased = (Integer)null;
Comments