Подтвердить что ты не робот

Java: само исключение имеет значение null

Я довольно запутался в проблеме андроида или проблеме с Java.

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

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

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

An exception is null.... ITS NOT A NULL POINTER EXCEPTION

4b9b3361

Ответ 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. Это звучит как ошибка эмулятора.

Ответ 2

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

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

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

Ответ 3

Я не уверен, что у меня такая же проблема, но я уже ответил на аналогичный вопрос... Если это происходит, когда вы пытаетесь прочитать из InputStream, посмотрите на эту ссылку...

Проблема с подключением Bluetooth для Android

Ответ 4

В Java вы можете выбросить NullPointerException, бросив null. В этом случае бросаемый в итоге будет NullPointerException.

public static void main(String[] args)
    {
        try{
            a(null);
        }
        catch(Exception e)
        {
            System.out.println(e);
            e.printStackTrace();
        }
    }
    public static void a(String[] args)  
    {
        throw null; 
    }

Выход:

java.lang.NullPointerException 
java.lang.NullPointerException  
at scjp.Scjp.a(Scjp.java:18)    
at scjp.Scjp.main(Scjp.java:8)