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也是有点兴趣,喜欢研究,看了网上的一些资料,和自己实验写出的。如果有什么不对的,欢迎指正,谢谢。