1
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)。但是,当我运行代码时,我得到一个空指针异常。堆栈跟踪的相关部分如下:空指针例外与Android中的输入流

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

+0

Pl。检查你在哪里调用这个函数。如果你得到空指针,请不要调用这个函数.... – Vinay 2012-03-13 05:46:38

回答

0

我发现有在你不检查的InputStream对空代码

1的两个问题。

2在从InpoutStream越来越DataInoutStream

为什么你使用下面的代码输入流转换为DatainoputSTream DataInputStream audioInput = new DataInputStream (new BufferedInputStream (_input));

在这段代码中,你正试图从输入流得到BufferrdInoutstream的有效途径和然后从缓冲输入流中尝试获取Data inout Stream。这是没有必要的,你可以从InputStream中 使用下面的代码

DataInputStream dis = new DataInputStream(_input);

+0

他说_(InputStream_input是一个参数,表示调用getResources()的结果。openRawResource(R.raw.audio_file),并且不为null )_ – 2012-03-13 06:16:21

2

使用grepcode.com直接拿到DataInputStream类,你可以看到你给的AssetInputStreamreadFile实例(来自衍生的InputStream)。 AssetInputStream.available电话getAssetRemainingLength与成员mAsset为PARAM - 我们怎么能看出,例如,here,NullException被抛出,如果mAssert == 0,但在从grepcode源,我们可以看到,在构造函数中AssetInputStream我们调用getAssetLength这确认是mAsset等于空太。这意味着在创建实例AssetInputStream之后mAsset已被取消。您可以从相同的grepcode.com页面看到,当您关闭AssetInputStream实例时会发生这种情况。所以答案是 - 在readFile方法被调用之前,您已经关闭了_input

+0

谢谢darkmist! – ashwin153 2012-03-13 14:07:41