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

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.

JavaProdigy
источник
2
Ответ, который был принят почти два года назад, дает почти то же самое объяснение, но является более ясным. Этот ответ также неверен для Java 5+: теперь он использует valueOf()фабричные методы, а не создает новые экземпляры для бокса.