[英]DataOutputStream nullpointer exception
我在Android的DataOutputStream
上收到NullPointerException
。
我首先编写了一些代码,以使用DataOutputStream
用Java写出文件。 一切正常。 我将代码导入到Android项目中,并且出现了一些奇怪的行为。
我更改为特定于Android的唯一代码是如何获取目录。
因此,实际发生的是:我正在创建DataOutputStream
,然后将其关闭。 到此为止。 我认为这是测试是否正确打开流是否要关闭流的一个很好的第一步。
DataOutputStream
是一个类实例变量。
当我用相同的方法调用close时,它关闭得很好。 当我从其他方法对其调用close时,它将获取NullPointerException
。 但是,尽管在Android中做了同样的事情,但在Java中做同样的事情并没有引起问题。
public class WavFileOutStream {
private DataOutputStream stream;
public WavFileOutStream(String fileName)
{
// Get the directory for the user's public pictures directory.
File file = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_RINGTONES), fileName);
if (!file.mkdirs()) {
Log.e("trace", "Directory not created");
}
try {
stream = new DataOutputStream(new FileOutputStream(file));
if(stream==null)
{
Log.i("trace","Null Stream!");
}
//<--PROBLEM LINE 1-->
//If I call close from this line I get NO nullPointer
//stream.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//<--PROBLEM LINE 1-->
//If I call close from this line I get a nullPointer
//I comment out other close() first
close();
}
public void close()
{
try {
stream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
错误:
02-24 12:49:39.229: E/AndroidRuntime(11539): FATAL EXCEPTION: main
02-24 12:49:39.229: E/AndroidRuntime(11539): Process: com.example.ringtonegenerator, PID: 11539
02-24 12:49:39.229: E/AndroidRuntime(11539): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.ringtonegenerator/com.example.ringtonegenerator.MainActivity}: java.lang.NullPointerException
02-24 12:49:39.229: E/AndroidRuntime(11539): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
02-24 12:49:39.229: E/AndroidRuntime(11539): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
02-24 12:49:39.229: E/AndroidRuntime(11539): at android.app.ActivityThread.access$800(ActivityThread.java:135)
02-24 12:49:39.229: E/AndroidRuntime(11539): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
02-24 12:49:39.229: E/AndroidRuntime(11539): at android.os.Handler.dispatchMessage(Handler.java:102)
02-24 12:49:39.229: E/AndroidRuntime(11539): at android.os.Looper.loop(Looper.java:136)
02-24 12:49:39.229: E/AndroidRuntime(11539): at android.app.ActivityThread.main(ActivityThread.java:5017)
02-24 12:49:39.229: E/AndroidRuntime(11539): at java.lang.reflect.Method.invokeNative(Native Method)
02-24 12:49:39.229: E/AndroidRuntime(11539): at java.lang.reflect.Method.invoke(Method.java:515)
02-24 12:49:39.229: E/AndroidRuntime(11539): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
02-24 12:49:39.229: E/AndroidRuntime(11539): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
02-24 12:49:39.229: E/AndroidRuntime(11539): at dalvik.system.NativeStart.main(Native Method)
02-24 12:49:39.229: E/AndroidRuntime(11539): Caused by: java.lang.NullPointerException
02-24 12:49:39.229: E/AndroidRuntime(11539): at com.example.ringtonegenerator.WavFileOutStream.close(WavFileOutStream.java:178)
02-24 12:49:39.229: E/AndroidRuntime(11539): at com.example.ringtonegenerator.WavFileOutStream.<init>(WavFileOutStream.java:43)
02-24 12:49:39.229: E/AndroidRuntime(11539): at com.example.ringtonegenerator.WavFileWriter.writeWave(WavFileWriter.java:10)
02-24 12:49:39.229: E/AndroidRuntime(11539): at com.example.ringtonegenerator.MainActivity.onCreate(MainActivity.java:23)
02-24 12:49:39.229: E/AndroidRuntime(11539): at android.app.Activity.performCreate(Activity.java:5231)
02-24 12:49:39.229: E/AndroidRuntime(11539): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
02-24 12:49:39.229: E/AndroidRuntime(11539): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
02-24 12:49:39.229: E/AndroidRuntime(11539): ... 11 more
如果在创建流时抛出异常,该流仍将为null,并且仍将调用close。 那里没有检查是否为空,因此它将抛出NPE。
public void close()
{
if(stream != null){
try {
stream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
在catch块之后有代码,该代码应位于try块内。 这就是为什么您要获得NPE。
潜在的问题是,当您应该调用file.getParentFile()。mkdirs()时,您正在调用file.mkdirs(),因此您将目标文件创建为目录,因此无法创建目标文件,因此您得到的是IOException而不是创建FileOutputStream,因此DataOutputStream引用仍然为null,因此,当执行catch块之后的代码(应位于try块中)时,您将获得NPE。
注意'new'的结果不能为空,因此直接进行测试是徒劳的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.