Ответ 1
Возможно ли это? В каком сценарии могут быть выбраны такие униализированные исключения?
Это невозможно с использованием сопоставимого Java-компилятора и совместимой виртуальной машины Java, а также с помощью совместимой виртуальной машины Davlik. JLS не допускает, чтобы переменная e
была null
в этом месте
Либо у вас есть багги-виртуальная машина, либо багги-отладчик, либо проблема с вашей IDE, создание инструментов и/или процесс.
Если бы я был в вашей ситуации, я бы остановил использование отладчика на данный момент и вернусь к добавлению старомодных отпечатков к вашему коду. И убедитесь, что вы делаете чистую и полную сборку из исходного кода.
Еще одна возможность, которую вы должны учитывать, состоит в том, что номера строк, которые JRE сообщает во время выполнения (и что отладчик полагается), не выстраиваются с номерами строк в исходном коде. Это может произойти, если вы допустили ошибку в процессах сборки и развертывания. Ошибка может быть чем-то вроде забывания, чтобы сохранить файл, забыв о сбое, забыв о развертывании новой версии приложения или о том, что ваша IDE не синхронизирована с файловой системой.
FWIW, теория состоит в том, что это вызвано throw null;
или что-то эквивалентное не удерживает воду. JLS раздел 14.18 гласит:
"Если оценка Expression завершается нормально, создавая нулевое значение, тогда создается экземпляр V 'класса NullPointerException и выбрасывается вместо null."
Легче понять, прочитаете ли вы это предложение в его контексте, но он ясно говорит, что throw null;
на самом деле бросает NullPointerException
.
ОБНОВЛЕНИЕ
Я нашел еще одно правдоподобное объяснение в этом вопросе SO: Исключение равно NULL всегда
В основном, он говорит, что эмулированный код бросает исключение, о котором Eclipse не знает, и эмулятор Eclipse "помогает", заменяя null
. Это звучит как ошибка эмулятора.