关于finally在异常处理中的一些心得
异常处理中,try{...}catch(Exception e){...}finally{...},try块是必须出现的,catch和finally至少出现一种。
在使用finally的时候,finally块中的代码总是被执行的,所以一般用来释放资源
public static void main(String[] args) {
try {
//业务代码
} catch (Exception e) {
//异常捕获块
}finally{
//资源释放块,总是被执行的
}
}
下面分几种情况讨论finally和try或者catch中代码的执行逻辑。
1.在try块或者catch块中有一条return语句,return语句是强制方法返回,一般执行到return语句到时候,程序立即结束该方法,但finally中的代码一定会被执行,所以在执行return之前,一定会先执行finally块中的代码
public static void main(String[] args) {
try {
System.out.println("try块被执行了...");//1
/*
* 此处加一条return语句,如果return语句执行,会立刻结束该方法,
* finally中的代码不会被执行
*/
return;//
} catch (Exception e) {
//异常捕获块
}finally{
//资源释放块,总是被执行的
System.out.println("finally块被执行了...");//2
}
System.out.println("其他代码...");//3
}
执行结果:
try块被执行了...
finally块被执行了...
显然,3语句没有被执行到,就是说执行3之前,方法已经结束了,但是语句2被执行了,因为finally中的代码一定会被执行。
此时,如果在try块或者catch块中使用System.exit(2),finally就不会被执行。
执行结果:
try块被执行了...
因为exit方法的调用时退出虚拟机,finally会失去执行机会。