4. finally
当异常发生时,通常方法的执行将做一个陡峭的非线性的转向,它甚至会过早的导致方法返回。例如,如果一个方法打开了一个文件并关闭,然后退出,你不希望关闭文件的代码被异常处理机制旁路。finally
关键字为处理这种意外而设计。
finally
创建的代码块在try/catch
块完成之后另一个try/catch
出现之前执行。finally
块无论有没有异常抛出都会执行。如果抛出异常,即使没有catch
子句匹配,finally
也会执行。一个方法将从一个try/catch
块返回到调用程序的任何时候,经过一个未捕获的异常或者是一个明确的返回语句,finally
子句在方法返回之前仍将执行。这在关闭文件句柄和释放任何在方法开始时被分配的其他资源是很有用。
finally
子句是可选项,可以有也可以无,但是每个try
语句至少需要一个catch
或者finally
子句。
class TestFinally{
static void proc1(){
try{
System.out.println("inside proc1");
throw new RuntimeException("demo");
}finally{
System.out.println("proc1's finally");
}
}
static void proc2(){
try{
System.out.println("inside proc2");
return ;
} finally{
System.out.println("proc2's finally");
}
}
static void proc3(){
try{
System.out.println("inside proc3");
}finally{
System.out.println("proc3's finally");
}
}
public static void main(String [] args){
try{
proc1();
}catch(Exception e){
System.out.println("Exception caught");
}
proc2();
proc3();
}
}
该例子中,proc1()抛出了异常中断了try
,它的finally
子句在退出时执行。proc2的try
语句通过return
语句返回,但在返回之前finally
语句执行。在proc3()中try
语句正常执行,没有错误,finally
语句也被执行。