java中finally块的需要是什么?

时间:2018-05-23 13:25:55

标签: java exception-handling

考虑以下java文档中的代码:

public void writeList() {
    PrintWriter out = null;

    try {
        System.out.println("Entering" + " try statement");

        out = new PrintWriter(new FileWriter("OutFile.txt"));
        for (int i = 0; i < SIZE; i++) {
            out.println("Value at: " + i + " = " + list.get(i));
        }
    } catch (IndexOutOfBoundsException e) {
        System.err.println("Caught IndexOutOfBoundsException: "
                           +  e.getMessage());

    } catch (IOException e) {
        System.err.println("Caught IOException: " +  e.getMessage());

    } finally {
        if (out != null) {
            System.out.println("Closing PrintWriter");
            out.close();
        } 
        else {
            System.out.println("PrintWriter not open");
        }
    }
}

"finally block executes whether an exception happens or not or an exception is not handled"这是我到处看到的定义。

我的问题是如果我用一个catch块替换两个catch块

,该怎么办?
try {
        System.out.println("Entering" + " try statement");

        out = new PrintWriter(new FileWriter("OutFile.txt"));
        for (int i = 0; i < SIZE; i++) {
            out.println("Value at: " + i + " = " + list.get(i));
        }
    } catch (Exception e) {
        e.printStacktrace()
    }

以上代码处理所有异常。 那么,为什么我们需要一个finally块呢?

可以在try-catch块之外编写,而不是在finally块中执行任何操作

为什么我们最终需要阻止?

2 个答案:

答案 0 :(得分:0)

根据oracle文档:

  

当try块退出时,finally块始终执行。这确保即使发生意外异常也会执行finally块。但最终不仅仅是异常处理有用 - 它允许程序员避免因返回,继续或中断而意外绕过清理代码。将清理代码放在finally块中总是一种很好的做法,即使没有预期的例外情况也是如此。

详细信息请参阅this article

现在回答您的以下问题:

  

现在上面的代码处理所有异常。那么,为什么我需要一个finally块呢?

,而不是在finally块中写一些东西,我可以在try-catch块之外写出来

假设您正在从catch块重新抛出异常,在这种情况下,catch块之后的代码将不会执行,但是如果您添加finally块{catch}块中重新抛出异常之前,finally块内的代码将执行。

答案 1 :(得分:0)

您不需要finally阻止。但是,这种解决方案被认为是不好的做法。

原因是现在,短语必须保持完全,以确保资源正确关闭。现在想象一下,如果另一个程序员(甚至你自己)需要在不远的将来某处修改这段代码。

顺便说一句,因为java 7是确保资源正确关闭的最安全的方法,所以使用try-with-resources