45

“finally”块总是在 try-catch 结束时执行,无论是否发生异常。但也总是执行 try-catch 之外和之后的每一行代码。那么,为什么要使用 finally 语句呢?

例子:

try {
    //code...
} catch (Exception e) {
    //code...
} finally {
    System.out.println("This line is always printed");
}
System.out.println("Also this line is always printed !! So why to use 'finally'?? ");
4

6 回答 6

23

最有用的情况是当您需要释放一些资源时:

InputStream is = ...
try {
    //code...
} catch (Exception e) {
    //code...
} finally {
    is.close();
}

更一般地说,当你想确保你的代码在最后执行时使用它,即使在执行期间出现异常:

long startTime = System.currentTimeMillis();
try {
    //code...
} catch (Exception e) {
    //code...
} finally {
    long endTime = System.currentTimeMillis();
    System.out.println("Operation took " + (endTime-startTime) + " ms");
}

始终finally执行此块的想法是,整个块之后的第一行并非如此

  • 如果catch方块让一些可投掷的传球
  • 如果它重新抛出异常,这是非常频繁的
于 2013-04-02T15:57:14.703 回答
7

最后一个System.out.println(在finally 块之后)只有在try 块中抛出的异常被catch 块实际捕获并且执行没有被return 语句中断时才会运行。

在您的示例中,finally 块将始终运行,但如果Error在 try 块中抛出 no(它不会被捕获),如果Throwable在 catch 块中抛出 no 并且没有其他语句,这将中断执行。

于 2013-04-02T16:02:21.640 回答
6

但也总是执行 try-catch 之外和之后的每一行代码。

好吧,并非总是如此。例如,我们可以 throwError不是Exceptionuon 的子类型,而是 Throwable,这样它就不会被catch(Exception e) {..}. 在这种情况下,块之前try的块会将控制流移出方法相应的finally部分将被调用,但它之后的代码不会。

看看这段代码

public static void main(String[] args) {
    try{
        //...
        throw new Error("something went terribly wrong");
    } catch (Exception e) {//will NOT catch Error
        e.printStackTrace();
    } finally{//this will be invoked regardless of what happens in try,              
        System.out.println("finally block");
    }

    //if Error will be thrown in above `try` it will move flow of control 
    //from this method, which will prevent it from reaching 
    //this place and executing code after this comment
    System.out.println("after finally... may not be executed");
}
于 2013-04-02T15:58:47.357 回答
1

finally 块是防止资源泄漏的关键工具。关闭文件或以其他方式恢复资源时,将代码放在 finally 块中以确保始终恢复资源。

但是 finally 不仅仅对异常处理有用——它允许程序员避免清理代码被 return、continue 或 break 意外绕过。将清理代码放在 finally 块中始终是一个好习惯,即使没有预料到异常也是如此。

更多在这里

于 2013-04-02T16:00:18.813 回答
-1

假设您正在写入文件,突然它会创建一个异常,即您如何关闭文件。然后最终帮助您,并且对于数据库事务 finally 块有很大帮助

于 2013-04-02T15:58:33.603 回答
-2

finally 块的唯一目的是关闭您在 try 块中打开的资源。资源可以是数据库连接、文件写入/读取等:

Connection conn= null;
try {
 conn= get the db conn;
//do some DML/DDL
}
catch(SQLException ex) {

}
finally {
conn.close();
}
于 2013-04-02T15:57:23.883 回答