Загадочный NPE

max аватар
95
Находится в разделах:

Каждый день узнаю что-то новое.  Оказывается, 

Так вот, ближе к делу. 

Есть Map:

в котором по ключу храняться Integer. (Object cast).  Предположим, она заполнена некоторыми данными. 

Есть метод: 

который, в свою очередь, вызывает вот это:

 

Так вот, был удивлен, что при вызове testNPE, если "test" не найден в коллекции, получается NullPointerException. И это при том, что аргумент метода - примитив, не объект. Рассчитывал на, как минимум,  на IllegalArgumentException. 

 

P.S: Кастинг в (Integer) someMap.get("test"); не вызывает npe.

 

 

Интересный случай... 


Конец
Бенджамин Франклин хочет заметить, что стоит отводить нужное время на все дела; большая спешка — большие потери.

хм, чего тут загадочного? - или я тебя не правильно понял:

null закастить можно к любому объекту, но это безсмысленно, получим все равно null, а null к примитиву ты не закастишь

 

max аватар

Загадочно не кастинг нулл к интеджер, а то, что выпал NullPointerException при передаче аргумента в метод  , а не, скажем,  IllegalArgumentException? int - примитив, к нему не применим NullPointerException. 

Я все-таки не правильно понял твой вопрос.

Ну насколько я помню:

(Integer) int  - при компиляции превращается в -  Integer.valueOf(int)

наверняка при обратной операции, происходит нечто подобное,

вот тут та и NPE.

 

 

max аватар

Теперь согласен. Но, скорее, происходит попытка получения (null).intValue();  Спасибо за наводку. Не додумал. 

Все верно. При unboxing в int компилятор вставляет вызов именно intValue.

Отправить комментарий

CAPTCHA
Чтобы оставить комментарий, введите пожалуйста код, изображенный на картинке
Image CAPTCHA
Введите символы, изображенные на картинке