如何确定导致我出现此空指针异常的原因?这是与设备相关的问题,我在设备中没有这个问题。
这是我从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。
答案 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"