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;
}
}
753   6  

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: (Integer) null к параметру int: int tickets_purchased.

Integer, в качестве ссылочного типа может быть null, но int в качестве примитивного типа быть не может, поэтому при попытке преобразования возникает ошибка.

Это преобразование называется операцией распаковки .

Как упоминают другие ответы, проблема заключается в следующем - (Integer) null.

Когда формальным типом аргумента метода является int и вы пытаетесь передать (Integer) null, произойдет следующее.

  1. Компилятор Java собирается сказать " Ах! У меня есть значение Integer, и мне нужно преобразовать его в значение int. Я выведу код на unbox it!".

  2. Код для распаковки значения-это вызов Integer.intValue(), использующий значение для распаковки в качестве цели объект. За исключением того, что значение равно null ... не реальная ссылка на объект.

  3. Во время выполнения вы в конечном итоге вызываете intValue() на null, и это вызывает NPE.

Некоторые компиляторы выдают предупреждение об этом, говоря, что код всегда будет бросать NPE. Однако это законный код Java, поэтому соответствующий компилятор Java не может назвать это ошибкой компиляции.


Возможные решения:

  1. Не используйте (Integer) null в качестве параметра. Проходить значение int или фактический (не нулевой) объект Integer. В этом случае ноль выглядит как разумная замена.

  2. Измените тип формального параметра с int на Integer... и распространить изменение на те места, где возвращается соответствующее значение поля, используется и т. д.

Первая альтернатива, вероятно, правильная, если только вам действительно не нужно моделировать возможность того, что" участник " приобрел неизвестный количество билетов. (И если вам действительно нужно смоделировать это, то ваше приложение должно справиться с этой возможностью ... как-то.)

Да, вы получаете исключение null-указателя, потому что Java попытается автобокс вашего null-целого числа в int, и это не будет работать, так как null-ints не допускаются :) (так как вы уже пробовали это, я думал, что id даст объяснение, почему вы видите такое поведение)

int tickets_purchased = (Integer)null; это запрещено в java.

Вы можете использовать Integer tickets_purchased = (Integer)null;

Comments

    Ничего не найдено.