Исключение нулевого указателя с входными потоками в Android - PullRequest
1 голос
/ 13 марта 2012
private double [] readFile (InputStream _input) throws IOException {
    DataInputStream audioInput = new DataInputStream (new BufferedInputStream (_input));

    int musicLength = (int)(audioInput.available()/2.0);
    double [] music = new double [musicLength];

    int i = 0; 
    while (i < audioInput.available() && i < musicLength) {
        music[i] = (double)audioInput.readShort();
        i++;
    }

    audioInput.close();
    return music;
}

Этот код является частью более крупного проекта, над которым я работаю, который использует методы DSP для сравнения двух аудиосигналов. Предполагается, что этот код возвращает значение double [], содержащее необработанные данные в аудиофайле (InputStream _input - это параметр, который представляет результат вызова getResources().openRawResource(R.raw.audio_file) и НЕ является нулевым). Однако когда я запускаю код, я получаю исключение Null Pointer. Соответствующая часть трассировки стека выглядит следующим образом:

03-12 22:24:57.818: W/System.err(8931): java.lang.NullPointerException
03-12 22:24:57.818: W/System.err(8931):     at android.content.res.AssetManager.getAssetRemainingLength(Native Method)
03-12 22:24:57.818: W/System.err(8931):     at android.content.res.AssetManager.access$300(AssetManager.java:36)
03-12 22:24:57.818: W/System.err(8931):     at android.content.res.AssetManager$AssetInputStream.available(AssetManager.java:552)
03-12 22:24:57.818: W/System.err(8931):     at com.ashwin.iSleep.AudioRecorder.readFile(AudioRecorder.java:88)

Согласно трассировке стека, точная ошибка при вызове audioInput.available(). Из того, что я могу сказать, проблема с родным методом AssetManager.getAssetRemainingLength(). Любая помощь приветствуется!

Ответы [ 2 ]

2 голосов
/ 13 марта 2012

Используя grepcode.com , вы можете видеть, что вы дали readFile экземпляр AssetInputStream (производный от InputStream).AssetInputStream.available вызывает getAssetRemainingLength с элементом mAsset в качестве параметра - и как мы можем видеть, например, здесь , NullException генерируется, если mAssert == 0. Но в исходном коде из grepcode мы можем видеть, чтов конструкторе AssetInputStream мы вызываем getAssetLength, который подтверждает, что mAsset также равен нулю.Это означает, что mAsset аннулируется после создания экземпляра AssetInputStream.На той же странице grepcode.com вы можете видеть, что это происходит, когда вы закрываете свой экземпляр AssetInputStream.Таким образом, ответ таков: вы закрыли _input до вызова readFile метода.

0 голосов
/ 13 марта 2012

Я обнаружил, что в коде есть две проблемы

1 Вы не проверяете входной поток на ноль.

2 Эффективным способом получения DataInoutStream из InpoutStream

Почему вы используете следующий код для преобразования inputtream в DatainoputSTream DataInputStream audioInput = new DataInputStream (new BufferedInputStream (_input));

В этом коде вы пытаетесь получить BufferrdInoutstream из inputtream, а затем из буферизованного входного потока вы пытаетесь получить Data inout Stream. Что не является необходимым, вы можете напрямую получить DataInputStream из InputStream используя следующий код

DataInputStream dis = new DataInputStream(_input);

...