简介
try catch finally语句块有不少烦、杂、难的问题, 有点头痛、本文章重在解决该类问题。
1、无论有没异常、finally都是执行。
这个自然不用多说、finally块解决的就是这种问题。常用在资源释放, 如关闭IO流、数据库连接等。
2、当try和catch中有return时,finally仍然会执行;
public class BarRun {
public static void main(String[] args)
{
int re = bar();
System.out.println(re);
}
private static int bar()
{
int a=1;
try{
return a;
}catch(Exception e){
return 0;
} finally{
System.out.println("finally");
}
}
3、finally是在return后面的表达式运算后执行的。
这句话乍一看较难理解, 意思是: return 并没有返回运算后的值,而是向同一个内存地址(假设地址是0x88)写入返回值,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
public class BarRun { public static void main(String[] args) { int re = bar(); System.out.println(re); } private static int bar() { int a=1; try{ return a; }catch(Exception e){ return 0; } finally{ a++;//改变a变量的值是不影响内存0x88内容的; System.out.println("finally"); } }
4、finally存在return语句, 将覆盖(修改)try或者catch中的return值。
try块return a; 将返回值写入到内存地址0x88, 内容为1,但是不会马上执行return返回。 接下来执行finally块, return ++a, 修改0x88的内容为2, 接着执行return ;
package it.ctf; public class BarRun { public static void main(String[] args) { int re = bar(); System.out.println(re); } private static int bar() { int a=1; try{ return a; }catch(Exception e){ return 0; } finally{ System.out.println("finally"); return ++a; } } /*输出: finally 2 */ }
总结: (1)任何执行try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。
(2)如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的。