错误:可能无法初始化FileOutputStream

时间:2010-10-11 14:43:54

标签: android exception-handling fileoutputstream

我正在尝试在我的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可能没有被初始化。我该如何修复此代码?

2 个答案:

答案 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。