java.lang.NullPointerException:InputStream.read

时间:2018-01-21 09:41:04

标签: android

如何确定导致我出现此空指针异常的原因?这是与设备相关的问题,我在设备中没有这个问题。

这是我从Google Developer获得的堆栈跟踪:

Samsung Galaxy J2 (j2lte), 1024MB RAM, Android 5.1
Report 1 of 5

java.lang.NullPointerException: 
at com.android.okio.OkBuffer.write (OkBuffer.java:574)
at com.android.okio.OkBuffer.read (OkBuffer.java:610)
at com.android.okio.RealBufferedSource.read (RealBufferedSource.java:56)
at com.android.okhttp.internal.http.HttpConnection$UnknownLengthSource.read 
(HttpConnection.java:584)
at com.android.okio.RealBufferedSource$1.read (RealBufferedSource.java:174)
at java.io.InputStream.read (InputStream.java:162)
at com.OnlineRecorder.home.MyService$11.run (Unknown Source)
at java.lang.Thread.run (Thread.java:818)

以下是我的代码如何记录和写入数据,这发生在我的应用程序中的服务中:

然后我开始录制:

        private void startRecording() {
        isRecording = true;
        recordingThread = new Thread(new Runnable() {

            @Override
            public void run() {
                filename = getFilename();
                //int bytesRead = 0;
                try {
                    url = new URL(selectedRadio);
                    inputStream = url.openStream();
                    fileOutputStream = new FileOutputStream(filename, true);
                    int c;
                    //isRecording=true;
                    final byte[] tmp = new byte[1024];
                    while ((c = inputStream.read(tmp))!= -1) {
                        //c = inputStream.read();
                        fileOutputStream.write(tmp,0,c);
                        fileOutputStream.getFD().sync();
                        //bytesRead++;
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }, "AudioRecorder Thread");
        recordingThread.start();
    }
然后我就这样停止录音了:

       public void stopRecording(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    if(inputStream != null && fileOutputStream != null) {
                        inputStream.close();
                        fileOutputStream.getFD().sync();
                        fileOutputStream.close();
                        File savedFile = new File(filename);
                        sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(savedFile)));
                        isRecording = false;
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

问题并不像看起来那么容易,它很棘手,空指针异常甚至不应该被重现开始,因为我已经在代码中有一个if else语句,其中我确保有一个打开的连接并且在我开始录制之前流式传输数据(我检查是否正在播放无线电)所以在任何情况下都不应抛出逻辑上的空值。

经过一些研究后,这个问题很常见,可能与此问题有关,如另一个网站的回复中所述:

  

这个NPE可能是由代码中的并发问题引起的。例如,使用或关闭多个线程的InputStream。

2 个答案:

答案 0 :(得分:1)

现在你可以这样做

 private void startRecording() {
            isRecording = true;
            recordingThread = new Thread(new Runnable() {

                @Override
                public void run() {
                    filename = getFilename();
                    //int bytesRead = 0;
                    try {
                        url = new URL(selectedRadio);
                        inputStream = url.openStream();
//do null check for input stream
                        if (inputStream != null) {
                            fileOutputStream = new FileOutputStream(filename, true);
                            int c;
                            //isRecording=true;
                            final byte[] tmp = new byte[1024];
                            while ((c = inputStream.read(tmp)) != -1) {
                                //c = inputStream.read();
                                fileOutputStream.write(tmp, 0, c);
                                fileOutputStream.getFD().sync();
                                //bytesRead++;
                            }
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }, "AudioRecorder Thread");
            recordingThread.start();
        }

答案 1 :(得分:1)

我只是想确认我解决了我的问题,Null指针异常是由我的代码中的并发问题引起的,这是由多个线程打开和关闭一个InputStream引起的。

我通过在启动关闭输入流的线程之前中断打开inputStream的线程来修复它。

代码中的

我添加了" recordingThread.interrupt();"然后在关闭inputStream之前添加一个if else语句来仔细检查线程是否成功中断:" if(recordingThread.isInterrupted())then..etc"