我正在尝试在我的onCreate方法中运行这段代码,作为为我的应用程序编写私有数据的初始测试。此代码直接来自位于here
的Android SDK开发指南String FILENAME = "hello_file";
String string = "hello world!";
FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();
但是,此代码给出了底部3行代码的错误。该错误是未处理的异常。建议的快速解决方法是:
String FILENAME = "hello_file";
String string = "hello world!";
FileOutputStream fos;
try {
fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
fos.write(string.getBytes());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
但是在这样做之后我得到了底部两行的错误,这些错误表明fos可能没有被初始化。我该如何修复此代码?
答案 0 :(得分:2)
替换
FileOutputStream fos;
与
FileOutputStream fos = null;
答案 1 :(得分:1)
是的,这里的问题是,如果你得到一个FileNotFoundException,你试图打印出异常并继续,但在这种情况下,fos变量从未被赋值,因为“openFileOutput”调用将不会已完成。这很好,因为在您无法打开文件的情况下,您不希望继续尝试写入您未打开的文件。
由于FileNotFoundException是IOException,您可以将所有这些简化为:
String FILENAME = "hello_file";
String string = "hello world!";
try {
FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
在这种情况下,引发异常的第一件事导致堆栈跟踪被打印,并且您跳过try {}块的其余部分中的任何后续操作。
水泥的答案问题是,虽然它是由编译器错误引起的,但如果第一个块抛出异常,第二个块会给你一个NullPointerException。