0

我正在尝试在我的 onCreate 方法中运行这段代码,作为编写私有数据以供我的应用程序使用的初始测试。此代码直接来自位于此处的 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 可能没有被初始化。如何修复此代码?

4

2 回答 2

2

代替

FileOutputStream fos;

FileOutputStream fos = null;
于 2010-10-11T15:20:48.167 回答
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。

于 2010-10-11T15:24:19.750 回答