在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(); }