Android java.lang.NullPointerException:InputStream.read

Android java.lang.NullPointerException:InputStream.read,android,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.

我如何识别导致此空指针异常的原因?这是一个与设备相关的问题,我的设备中没有

这是我从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语句,在我开始录制之前,我确保有一个打开的连接和数据流(我检查是否正在播放广播)因此,在任何情况下都不应抛出逻辑null

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

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


现在你可以这样做了

 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();
        }

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

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


在代码中,我添加了“recordingThread.interrupt();”,并添加了一个if-else语句,以在关闭输入流之前仔细检查线程是否被成功中断:“if(recordingThread.isInterrupted())then..etc”

您是否创建了一个名为
RealBufferedSource
的类?不,我只有这些代码,这些代码我从后台线程调用它们,即使它们在服务中运行..就像这个public void startRecordThread(){new thread(new Runnable(){@Override public void run(){AppLog.logString(“Start Recording”);startRecording();}).Start()}您好,这并没有解决问题,经过多次测试,我很幸运地发现了问题,当我在“stopRecording()关闭连接时,问题就发生了经过一些研究,我发现这可能与多线程有关,因为我使用两个不同的线程来打开和关闭连接。正如在另一个网站的评论中所述:“这可能是由于代码中的并发问题导致的NPE。例如,使用或关闭来自多个线程的InputStream。”