Чому нульовий вказівник замість класу?


26

На Java:

int count = (Integer) null;

кидає java.lang.NullPointerException.

Чому це не кидає виключення Class Cast для спрощення розуміння програміста?

Чому цей виняток був обраний над будь-яким іншим винятком?

Відповіді:


46

Під час виконання вашого коду виконання Java виконує наступні дії:

  1. Киньте null об’єкту класу Integer.
  2. Спробуйте розблокувати об'єкт Integer до int, викликавши метод intValue ()
  3. Виклик методу на нульовому об'єкті кидає NullPointerException.

Іншими словами, null може бути передано до Integer без проблем, але нульовий цілий об'єкт не може бути перетворений у значення типу int.

EDIT

У мене було певне питання, пов’язане з тим, що раніше у Stack Overflow дивіться тут .


1

Java успішно призначає нуль до посилання Integer, на яке немає посилань.

Це нормально, тому що бути непроголошеним - це дійсний стан для довідок.

Це виклик методу неіснуючого об'єкта, який неможливо виконати.

Виконання трансляції (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()що кидає a NullPointerException.


2
Відповідь, яку прийняли майже два роки тому, дає майже те саме пояснення, але є більш зрозумілою. Ця відповідь також не є правильною для Java 5+: тепер вона використовує valueOf()фабричні методи, а не створює нові екземпляри для боксу.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.