Java: само исключение равно null

Я довольно смущен. Это проблема Android или проблема с самой Java?

Когда я отлаживал приложение для Android, которое работает с Bluetooth, поток остановился на блоке перехвата IOException, в котором я позже узнал, что исключение e было нулевым.... Оно было выдано, когда я пытался читать из InputStream.

Да, это было не NullPointerException, а какое-то другое исключение, которое равно null - лучше сказать, выброшено неинициализированным.

Является ли это возможным? В каком сценарии могут быть выброшены такие унифицированные исключения?

Исключение равно null... Примечание: это НЕ исключение нулевого указателя!!


person Prasham    schedule 06.12.2011    source источник
comment
Пожалуйста. добавьте исключение генерации образца кода.   -  person Azodious    schedule 06.12.2011
comment
это просто вызов BluetoothInputStream.read() с уже подключенным устройством... Но я пытаюсь сделать снимок в качестве доказательства, если кому-то интересно......   -  person Prasham    schedule 06.12.2011
comment
@Dimme как IOException??? или я перехватываю этот нулевой бросок в блоке перехвата IOException, потому что он написан первым???? ЯВЛЯЕТСЯ ЛИ ЭТО ВОЗМОЖНЫМ???   -  person Prasham    schedule 06.12.2011
comment
Я уже видел, как отладчик обманывался устаревшим кодом. Попробуйте очистить проект и попробовать еще раз, может быть?   -  person Ian McLaird    schedule 06.12.2011


Ответы (2)


Является ли это возможным? В каком сценарии могут быть выброшены такие унифицированные исключения??

Это невозможно при использовании совместимого компилятора Java и совместимой виртуальной машины Java, а также соответствующей Виртуальная машина Dalvik. JLS не позволяет переменной e быть null в этом месте.

Либо у вас глючит виртуальная машина, глючит отладчик, либо проблема с вашей IDE, инструментами сборки и/или процессом.

Если бы я был в вашей ситуации, я бы пока прекратил использовать отладчик и вернулся к добавлению в ваш код устаревших отпечатков трассировки. И убедитесь, что вы делаете чистую и полную сборку из исходного кода.


Еще одна возможность, которую следует учитывать, заключается в том, что номера строк, о которых JRE сообщает во время выполнения (и на которые полагается отладчик), не совпадают с номерами строк в исходном коде. Это может произойти, если вы допустили ошибку в процессах сборки и развертывания. Ошибка может заключаться в том, что вы забыли сохранить файл, забыли собрать, забыли развернуть новую версию приложения или рассинхронизировали IDE с файловой системой.


Что бы это ни стоило, теория состоит в том, что это вызвано throw null; или чем-то эквивалентным, не выдерживает критики. В разделе JLS 14.18 говорится:

"Если вычисление Expression завершается нормально и дает нулевое значение, то экземпляр V' класса NullPointerException создается и генерируется вместо null."

Это легче понять, если вы прочитаете это предложение в его контексте, но оно ясно говорит о том, что throw null; на самом деле выдает NullPointerException.


ОБНОВЛЕНИЕ

Я нашел другое правдоподобное объяснение в этом вопросе о переполнении стека: Exception всегда NULL

По сути, это говорит о том, что эмулируемый код генерирует исключение, о котором Eclipse не знает, а эмулятор Eclipse «услужливо» заменяет null. Похоже на баг эмулятора.

person Stephen C    schedule 06.12.2011

Вероятно, вас обманывает ваш отладчик.

Добавьте еще одну строку кода под этой строкой (что-то бесполезное, например if(false) log.v("","");), прервите ее и проверьте оттуда значение вашего исключения.

Также попробуйте Log.e(TAG, "my null exception", e); и прочитайте журнал.

person tacone    schedule 06.12.2011
comment
Журнал должен печатать что-то об этом броске, но, вероятно, бросок имеет значение null .... он печатает не более, чем мое нулевое исключение - person Prasham; 06.12.2011
comment
Быть обманутым вашим отладчиком не обязательно ограничивается введением в заблуждение - отладчик может потенциально исказить ход выполнения программы или состояние, а не просто исказить его. - person Chris Stratton; 14.05.2014