try { //可能出异常 catch { //try异常则执行,否则这里的代码不会执行 } finally { //不管有没有异常,finally都会执行 }比如
public class Test { public static void main(String[] args) { //try语句,出错了首先执行catch语句,在执行finally语句,即使有return,finally语句块也会执行 try{ int c=Integer.parseInt("1gjrio"); //这语句不会执行 System.out.println(c); }catch(Exception e) { System.out.println("catch------转换错误!!!"); } finally { System.out.println("finally------执行"); } } }
但是有人遇到过面试题 如果 try里面有return 语句,finally会执行吗?catch里面有return 语句会执行吗?
答案是肯定的,
请看一下代码
package exceptionfinally;
public class Test {
public static void main(String[] args) {
System.out.println(getNum());
}
public static int getNum(){
int i=1;
try{
int c=Integer.parseInt("1gjrio");
return i;
}
catch(Exception e){
System.out.println("catch");
i=3;
return i;
}finally{
i=2;
// return i;
}
}
}
得到的结果是多少呢?答案是:3
如果把这个return 的注释去掉 答案是多少呢? 答案是:2
原理是什么呢?看了资料还是很简单的
return语句的执行是: 将结果集压入调用此函数的栈帧的operate stack, 然后将此方法栈帧从jvm stack 弹出来,方法调用完毕,finally就在结果压栈与方法栈帧弹出的中间执行。如果finally里面有return语句,则jvm虚拟机再这样执行一次,然后就出现了上面的结果。
以上问题,小弟学习java也是有点兴趣,喜欢研究,看了网上的一些资料,和自己实验写出的。如果有什么不对的,欢迎指正,谢谢。