【问题标题】:Null Pointer Exception with Input Streams in androidandroid中输入流的空指针异常
【发布时间】:2012-03-13 05:40:42
【问题描述】:
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 技术。这段代码应该返回一个包含音频文件中原始数据的双 [](InputStream _input 是一个参数,表示调用 getResources().openRawResource(R.raw.audio_file) 的结果,并且不为空)。但是,当我运行代码时,我得到一个空指针异常。堆栈跟踪的相关部分如下:

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()。任何帮助表示赞赏!

【问题讨论】:

  • PL.检查你从哪里调用这个函数。如果你得到空指针,不要调用这个函数......

标签: android audio nullpointerexception signal-processing inputstream


【解决方案1】:

使用grepcode.com,您可以看到您给出了readFileAssetInputStream 实例(派生自 InputStream )。 AssetInputStream.available 以成员 mAsset 作为参数调用 getAssetRemainingLength - 以及我们如何看到,例如,here,如果 mAssert == 0 则抛出 NullException。但在来自 grepcode 的源代码中,我们可以在构造函数 @987654329 中看到这一点@ 我们调用 getAssetLength 验证是 mAsset 也等于 null。这意味着 mAsset 在创建 AssetInputStream 实例后无效。您可以从同一 grepcode.com 页面看到,当您关闭 AssetInputStream 实例时会发生这种情况。所以答案是 - 在调用 readFile 方法之前,您已经关闭了 _input

【讨论】:

    【解决方案2】:

    我发现代码中有两个问题

    1 您没有针对 null 检查输入流。

    2 从 InpoutStream 获取 DataInoutStream 的有效方式

    为什么您使用以下代码将输入流转换为 DatainoputSTream DataInputStream audioInput = new DataInputStream (new BufferedInputStream (_input));

    在此代码中,您尝试从输入流中获取 BufferrdInoutstream,然后从缓冲输入流中获取数据输入流。没有必要,您可以直接从 InputStream 获取 DataInputStream 使用以下代码

    DataInputStream dis = new DataInputStream(_input);

    【讨论】:

    • 他说(InputStream_input是代表调用getResources().openRawResource(R.raw.audio_file)结果的参数,不为空)
    猜你喜欢
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    • 1970-01-01
    相关资源
    最近更新 更多