return语句在try-catch-finally中的执行顺序
一般情况下:
public class TryCatchReturn { public static void main(String[] args) { TryCatchReturn tcr = new TryCatchReturn(); System.out.println("tcr.test(): "+tcr.test()); } public int test(){ int a = 0; try{ System.out.println("a: "+a); a = 110; }catch(Exception e){ a = a+3; }finally{ a ++; System.out.println("finally a: "+a);
} return a; } }
执行结果:
a: 0
finally a: 111
tcr.test(): 111
1.首先测试3个块的return的优先级
public class TryCatchReturn { public static void main(String[] args) { TryCatchReturn tcr = new TryCatchReturn(); System.out.println("tcr.test(): "+tcr.test()); } public int test(){ int a = 0; try{ System.out.println("a: "+a); a = 110; return a; }catch(Exception e){ a = a+3; return a; }finally{ //警告: finally block does not complete normally a ++; System.out.println("finally a: "+a); return a; } //return a; //编译报错,不被执行! } }
执行结果:
a: 0
finally a: 111
tcr.test(): 111
可知test()方法最后是从finally模块的return语句返回的;
结论:
1.finally 模块总是会得到执行,且finally模块的return 也总会被执行,而此时try模块的return可以被认为是没有被执行;
2.不推荐在finally模块内return;
2.测试finally块无return时的返回顺序;
public class TryCatchReturn { public static void main(String[] args) { TryCatchReturn tcr = new TryCatchReturn(); System.out.println("tcr.test(): "+tcr.test()); } public int test(){ int a = 0; try{ System.out.println("a: "+a); a = 110; return a; }catch(Exception e){ a = a+3; return a; }finally{ a ++; System.out.println("finally a: "+a); } } }
执行结果:
a: 0
finally a: 111
tcr.test(): 110
test()方法中,try模块的return语句先于finally模块执行,但return并不立即返回,而是执行后,将把返回结果放置进函数栈中,待finally模块执行完后,又返回至try模块的return语句,退出方法,完成执行。因此,对于此种情况,可以认为try模块的return语句先于finally模块执行,但是方法最终还是从return语句返回退出的。
结论:
1. 当try或catch块中有return语句时,finally模块中的语句仍会执行;
2. 当try或catch模块有return语句,若finally模块中无return时,try或catch模块的return返回值在finally模执行前确定的,且return语句先于finally模块执行;
3.当return在try-catch-finally语句之后时,finally模块是在return前执行的;(如首例子所示)
3.测试catch模块介入时return的返回顺序(finally无return);
public class TryCatchReturn { public static void main(String[] args) { TryCatchReturn tcr = new TryCatchReturn(); System.out.println("tcr.test(): "+tcr.test()); } public int test(){ int a = 0; try{ System.out.println("a: "+a); a = 110; throw new Exception(); //try不能return,unreachable }catch(Exception e){ a = a+3; return a; }finally{ a ++; System.out.println("finally a: "+a); } } }
执行结果:
a: 0
finally a: 114
tcr.test(): 113
test()是从catch模块的return语句返回,执行过程类似测试2, finally模块是在catch模块的return执行之前才执行的,且catch模块的return返回值在finally模执行前确定的;
4.测试catch模块介入时return的返回顺序(finally有return);;
public class TryCatchReturn { public static void main(String[] args) { TryCatchReturn tcr = new TryCatchReturn(); System.out.println("tcr.test(): "+tcr.test()); } public int test(){ int a = 0; try{ System.out.println("a: "+a); a = 110; throw new Exception(); //try不能return,unreachable }catch(Exception e){ a = a+3; return a; }finally{ a ++; System.out.println("finally a: "+a); return a;
} } }
执行结果:
a: 0
finally a: 114
tcr.test(): 114
test()是从finally模块的return语句返回的,catch模块的return可被认为是没有执行,且最终返回的是finally模块a的值;
4.总结
1.无论是否有异常,finally块中的语句都会执行,无论try或catch模块是否有return;
2.若finally模块有return,无论try或catch模块中是否有return,程序段最终从finally的return返回;
但一般不推荐在finally语句中return;
3. 若finally模块无return,且try或catch模块有return,try或catch模块的return返回值在finally模块执行前就已经确定,然后执行finally模块,且但方法最终从return语句返回;
4.对于try-catch-finally语句之后的return语句,finally模块是在return前执行的,且return返回值在finally模执行后确定的;
相关推荐
Java的 try 与 catch finally关键字的使用
try、catch、finally、return 执行顺序超详细讲解,包看包会。
在Java的异常机制中,如果finally中含有return语句,则try和catch中的return语句将会被JVM忽视
17.javatry…catch…finally语句.zip17.javatry…catch…finally语句.zip17.javatry…catch…finally语句.zip17.javatry…catch…finally语句.zip17.javatry…catch…finally语句.zip17.javatry…catch…finally语句...
Condition 3: try中有异常,try-catch-finally里都没有return ,finally 之后有个returntry中有异常以后,根据
try-catch-finally执行顺序验证(左边是.java文件,右边是.class文件) 提示: try、catch块内的return操作编译后会变成把return的值保存到变量var的操作。 总结: try、catch块内的return操作编译后会变成把return的值...
主要介绍了C#中的try catch finally用法,以实例形式分析了try catch finally针对错误处理时的不同用法,具有一定的参考借鉴价值,需要的朋友可以参考下
使用try-catch-finally处理异常
try-catch-finally捕获异常try-catch-finally捕获异常
VB.NET 演示带Finally的Try Catch 异常处理用法...使用Finally的好处是,把资源释放或状态还原的代码放到finally块中,可以保证在try和catch语句执行完后,一定会执行finally语句块,而不用考虑各种复杂的跳转情况。
压缩包里有本人录制的一个小视屏,不会的亲们,可以看下哦~~~ 笨人要期末考了呢,录些小视屏供自己复习所用,也是为了资源共享~O(∩_∩)O~
主要介绍了Java try catch finally异常处理组合详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
第二:finally里面不建议放return语句,根据需要,return语句可以放在try和catch里面和函数的后。可行的做法有四: 1、return语句只在函数后出现一次。 2、return语句仅在try和catch里面都出现。 3、...
首先执行try,如果有异常执行catch,无论如何都会执行finally,当有return以后,函数就会把这个数据存储在某个位置,然后告诉主函数,我不执行了,接下来你执行吧,所以函数就会推出
异常处理的基本思想是简化程序的错误代码,为程序键壮性提供一个标准检测机制。 本文为你解释怎样处理C++的异常处理。提供了大量的code
java中try catch的用法 java try catch的用法 java中 try catch的用法
java try…catch嵌套捕获异常的实例 java try…catch嵌套捕获异常的实例
异常处理try catch在vc中的用法.zip visual c++ try catch处理异常
在C语言中,使用goto和标签的方式模拟try catch的功能,使用setjmp和longjmp方式模拟try catch的功能,两种方式都可以使用,setjmp的方式可以支持try catch嵌套,goto的方式不支持嵌套,但是jmpbuf的开销是比较大的...
主要介绍了再谈异常处理try catch finally 的相关资料,需要的朋友可以参考下