在java中的try-catch块之后使用“finally”有什么好处?

当try-catch结束时,总是执行“finally”块,以防exception。 但是try-catch之外和之后的每一行代码都会被执行。 那么,我为什么要使用最后的陈述呢?

例:

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'?? "); 

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

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

更一般地说,当你想要确保你的代码在最后被执行的时候,即使在执行期间有一个exception,你也可以使用它:

 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块让一些throwable pass
  • 如果它重新出现了一个例外,这是非常频繁的

最后一个System.out.println (在finally块之后)只有在try块中抛出的exception被catch块捕获并且执行不被例如return语句中断的情况下才会运行。

在你的例子中,finally块总是被运行,但是如果在try块中没有抛出Error (它不会被捕获),那么如果在catch块中没有抛出Throwable ,那么执行只会继续到finally块之后没有其他的说法,会中断执行。

而且try-catch之外和之后的每一行代码都会被执行

这是不正确的。 如果未经检查的exception(RuntimeException,Error及其子类)代码finally将不会执行。

看看这个代码

 public static void main(String[] args) { try{ someDengerousMethod(); } catch (Exception e) { e.printStackTrace(); }finally{ System.out.println("finally block"); } System.out.println("after finally..."); } public static void someDengerousMethod(){ throw new Error("something went wrong"); } 

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

但是最后对于不仅仅是exception处理而言是有用的 – 它允许程序员避免由于返回,继续或中断而意外绕过清除代码。 清理代码放在finally块里总是一个很好的习惯,即使没有预期的例外。

更多在这里

假设你正在写文件,突然间它会创build一个exception,如何closures文件。最后,最后帮助你,也为数据库事务最终块帮助了很多

finally块的唯一目的是closures你在try块内打开的资源 。 资源可以是数据库连接,文件写入/读取等任何东西:

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