在Java中,如果捕获到IOException后,我该如何关闭一个文件?

12 浏览
0 Comments

在Java中,如果捕获到IOException后,我该如何关闭一个文件?

大家好,\n我想确保当我捕获到IOException时,我用BufferedReader打开的文件被关闭,但是看起来我的BufferedReader对象在catch块中超出了范围。\n

public static ArrayList readFiletoArrayList(String fileName, ArrayList fileArrayList)
{
    fileArrayList.removeAll(fileArrayList);
    try {
        //打开文件以供读取
        BufferedReader fileIn = new BufferedReader(new FileReader(fileName));
        //逐行将文件内容添加到数组列表,直到文件末尾(待办事项)
        while(true){
                fileArrayList.add(fileIn.readLine());
            }
    }catch(IOException e){
        fileArrayList.removeAll(fileArrayList);
        fileIn.close(); 
        return fileArrayList; //返回空列表,在调用代码中处理
    }
}

\nNetbeans报错说在catch块中找不到符号fileIn,但是我希望确保在出现IOException时,Reader被关闭。我该如何做到这一点,而不需要在第一个try块周围使用第二个try/catch结构这样的丑陋的代码?\n对于这种情况下的最佳实践,有什么提示或指导意见吗?感谢!

0
0 Comments

在这段代码中,问题的原因是在catch块中没有关闭文件。解决方法是将关闭文件的代码放在finally块中,以确保无论成功还是失败都会关闭文件。

以下是修改后的代码:

public static ArrayList readFiletoArrayList(String fileName, ArrayList fileArrayList) {
    fileArrayList.removeAll(fileArrayList);
    BufferedReader fileIn = null;
    try {
        // 打开文件进行读取
        fileIn = new BufferedReader(new FileReader(fileName));
        // 逐行将内容添加到数组列表,直到文件末尾
        // 当buffered reader返回null时(待办事项)。
        while (true) {
            fileArrayList.add(fileIn.readLine());
        }
    } catch (IOException e) {
        fileArrayList.removeAll(fileArrayList);
    } finally {
        if (fileIn != null) {
            try {
                fileIn.close();
            } catch (IOException e) {
                // 处理关闭文件时可能出现的异常
                e.printStackTrace();
            }
        }
    }
    return fileArrayList;
}

这样修改后,无论正常执行还是发生异常,都会在返回之前关闭文件。

0
0 Comments

在Java中,当我们处理文件时,有时候会遇到IOException异常。在处理这个异常的时候,我们需要关闭打开的文件,以释放系统资源。然而,有时候我们可能会遇到一个问题:在捕获IOException异常后,我们如何关闭文件?

问题的原因是,在try块中声明的变量在catch块中失去了作用域。这意味着我们无法直接在catch块中关闭文件。为了解决这个问题,我们可以通过以下步骤来关闭文件:

1. 首先,在try块之前声明一个BufferedReader类型的变量fileIn,并将其赋值为null。这样我们就可以在整个方法中访问这个变量。

BufferedReader fileIn = null;

2. 在try块内部,我们将文件赋值给fileIn变量。

fileIn = new BufferedReader(new FileReader("file.txt"));

3. 在catch块中,我们可以使用if语句来检查fileIn变量是否为null。如果不为null,则关闭文件。

if(fileIn != null) {
    fileIn.close();
}

通过这种方法,我们可以在捕获IOException异常后,安全地关闭文件,以避免资源泄漏问题。这样可以确保我们的程序在处理异常时,能够正确地释放系统资源,提高程序的稳定性和可靠性。

0
0 Comments

在上述代码中,问题出现的原因是在捕获到IOException后没有关闭文件。解决方法是在finally块中关闭文件。

具体代码如下:

BufferedReader fileIn = null;
try {
    fileIn = new BufferedReader(new FileReader(filename));
    //其他操作
} catch(IOException e) {
    fileArrayList.removeall(fileArrayList);
} finally {
    try {
        if (fileIn != null) fileIn.close();
    } catch (IOException io) {
        //记录异常日志
    }
}
return fileArrayList;

对于上述代码,有一些需要注意的事项:

- 关闭操作应该放在finally块中,否则文件不会在代码正常完成或抛出除IOException以外的其他异常时关闭。

- 通常情况下,应该有一个静态的实用方法来关闭资源,这样可以检查null并捕获任何异常(在这种情况下,除了记录日志之外,不需要其他操作)。

- return语句应该放在try块之后,这样主线代码和异常捕获都有一个返回方法,避免重复。

- 如果将return放在finally块中,会生成编译器警告。

在这个问题的回答中,有一个提到要注意使用finally块的评论。令人惊讶的是,很多答案没有提到这一点。以下是一些有用的Sun链接: Lesson: Basic IO和Lesson: Exceptions

除非您打算告诉用户无法关闭文件而无法打开文件,否则可以删除对null的检查并捕获Exception。但是,通常情况下,用户不在意。

您关闭了BufferedReader,但没有关闭FileReader?

关闭BufferedReader将自动关闭FileReader。

确实,Java IO类遵循装饰器模式。所以在每个close()下面将向上委托给装饰实例。

Jarvis,这当然是一个合理的替代方案,但我认为上面的代码代表了“标准”的最佳实践。但只要记录异常,我认为没有关系。

这不被认为是最佳实践-而是Resource resource = acquire(); try { use(resource); } finally { resource.release(); } -请查看我的答案下面和链接

_and_Mrs_D,这个建议的问题是acquire通常会抛出与后续操作相同的异常,导致异常处理变得混乱。如果将close方法上的异常视为其他异常的等效异常,则没有关系,但如果想要分别处理它们,检查null只是最清晰的方法。

只有我一个人觉得在相同的异常的catch块中放置try是奇怪的冗余吗?我知道我们必须这样做,但这似乎暗示着某些根本性的严重缺陷。

这是旧的做法。首选的解决方法应该是Java 7中新添加的自动关闭资源的特性。

0