有时你或许想要定义一个退出try/catch代码块时可以执行的代码块.例如,异常或许引起一个终止当前方法的错误,造成其提前返回.然而方法已经打开了一个需要关闭文件或网络连接.这种情况在程序设计中很常见,所以Java提供了一种方便的方式来处理这种情况,这种方式就是使用finally代码块.
为了指定一个要在退出try/catch代码块时执行的代码块,我们在try/catch代码块的末尾引入了finally代码块.包含finally的try/catch的基本形式如下所示:
try{ //block of code to monitor for errors } catch (exceptionType1 exOb) { //handler for exceptionType1 } catch (exceptionType2 exOb) { //handle for exceptionType2 } finally { //finally code }
无论是处于何种原因,一旦执行流离开try/catch代码块,就会执行finally代码块.即无论try是正常结束还是由于异常结束,最后都会执行finally定义的代码.如果try代码块中的任何代码或他的任何catch语句从方法返回,也会执行finally代码块.
下面是finally代码块的示例:
try { Rethrow.getException(); }catch(Throwable exc) { System.out.println("standard message is:"); System.out.println(exc); System.out.println("Stack trace:"); exc.printStackTrace(); } finally { System.out.println("leaved try"); }
输出:
standard message is: java.lang.ArithmeticException Stack trace: java.lang.ArithmeticException at javaTest.Rethrow.getException(test2.java:28) at javaTest.test2.main(test2.java:10) leaved try
示例2:
try { }catch(Throwable exc) { System.out.println("standard message is:"); System.out.println(exc); System.out.println("Stack trace:"); exc.printStackTrace(); } finally { System.out.println("leaved try"); }
输出:
leaved try
正如输出所示,无论try代码块如何退出,都会执行finally代码块.