Почему нулевой указатель вместо класса приведен?


26

В Java:

int count = (Integer) null;

генерирует исключение java.lang.NullPointerException.

Почему это не создает исключение Class Cast для облегчения понимания программистом?

Почему это исключение было выбрано над любым другим исключением?

Ответы:


46

При выполнении вашего кода среда выполнения Java выполняет следующие действия:

  1. Приведите ноль к объекту класса Integer.
  2. Попробуйте распаковать объект Integer в int, вызвав метод intValue ()
  3. Вызов метода для нулевого объекта вызывает исключение NullPointerException.

Другими словами, null может быть приведен к Integer без проблем, но объект с нулевым целым не может быть преобразован в значение типа int.

РЕДАКТИРОВАТЬ

У меня был связанный вопрос некоторое время назад в переполнении стека, смотрите здесь .


1

Java успешно переводит ноль в целочисленную ссылку, которая не ссылается на объект.

Это нормально, потому что отсутствие ссылки - это действительное состояние для ссылки.

Это вызов метода несуществующего объекта, который не может быть выполнен.

Выполнение приведения (Integer)nullаналогично объявлению переменной типа Integer и невозможности присвоить ей новый (или уже существующий) экземпляр объекта Integer.


-1

Чтобы распаковать a Integerв intie int i = new Integer(15);, iфактически, равно new Integer(15).intValue() i = (Integer) o; где так Object o = 15же, как, o = Integer.valueOf(15);но i = null; бросает, NullPointerExceptionпотому что iтогда равно, null.intValue()который бросает NullPointerException.


2
Ответ, который был принят почти два года назад, дает почти то же самое объяснение, но является более ясным. Этот ответ также неверен для Java 5+: теперь он использует valueOf()фабричные методы, а не создает новые экземпляры для бокса.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.