Исключение нулевого указателя из встроенного условного оператора - PullRequest
3 голосов
/ 19 июля 2011

Я получаю странное исключение нулевого указателя и не могу понять, почему.Я сузил его с помощью этого простого тестового кода, который выбрасывает NPE во второй строке:

Long test = null;
Long result = true ? test : -1L;

Пока этот код работает нормально:

Long result = true ? null : -1L;

Этого достаточно легко избежать,просто не использую встроенное условное выражение, но кто-нибудь может объяснить мне, почему это происходит?

Ответы [ 4 ]

5 голосов
/ 19 июля 2011

Я думаю, это сводится к распаковке.Будет работать следующий код:

Long two = true ? test : new Long(-1);

Если для одного параметра задано значение -1, он попытается распаковать тест, чтобы он воспринимал оба типа как один и тот же тип.Распаковка null приведет к исключению нулевого указателя.Если в утверждении оно пустое, оно будет достаточно умным, чтобы не пытаться его распаковать.

2 голосов
/ 19 июля 2011

Пытается распаковать ссылку test, чтобы получить значение long, чего не может сделать.

0 голосов
/ 19 июля 2011

В первом примере думается, что выражение справа имеет тип long (из-за константы справа); поэтому он с помощью autoboxing пытается получить значение test как long, которое выбрасывает и NPE.

Во втором примере все трактуется как справочное значение; без авто-бокса и без сбоев.

0 голосов
/ 19 июля 2011

Я думаю, это происходит потому, что Ланг инкапсулирует Ланг.Итак, каким-то образом ваше выражение пытается получить какое-либо свойство или длинное значение из объекта Long ... что-то вроде этого ...

прочитайте документацию здесь: http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Long.html

надеюсь, это поможет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...