一、try/catch/finally在没有return的情况下
无异常:try->finally->跳出
有异常:try->catch->finally->跳出
二、try/catch/finally在含有return的情况下
大致存在六种情况:
1、情况1:try{} catch(){}finally{} return;
结果显然是程序按顺序执行。
情况2:try{ return; }catch(){} finally{} return;
程序执行try块中return之前代码(包括return语句中的表达式运算);
再执行finally块,最后执行try中return;
finally块之后的语句return,因为程序在try中已经return所以不再执行。
情况3:try{ } catch(){return;} finally{} return;
程序先执行try,如果遇到异常执行catch块,
无异常:执行完try再finally再return.
有异常:则执行catch中return之前代码(包括return语句中的表达式运算),再执行finally语句中全部代码,最后执行catch块中return、finally块之后的语句return,因为程序在try中已经return所以不再执行。
情况4:try{ return; }catch(){} finally{return;}
程序执行try块中return之前代码(包括return语句中的表达式运算);
再执行finally块,因为finally块中有return所以提前退出。
情况5:try{} catch(){return;}finally{return;}
程序执行catch块中return之前代码(包括return语句中的表达式运算);
再执行finally块,因为finally块中有return所以提前退出。
情况6:try{ return;}catch(){return;} finally{return;}
程序执行try块中return之前代码(包括return语句中的表达式运算);
无异常:则再执行finally块,因为finally块中有return所以提前退出。
有异常:执行catch块中return之前代码(包括return语句中的表达式运算);则再执行finally块,因为finally块中有return所以提前退出。
总结:
1、无论try、catch中是否含有return,finally最终都一定会执行。
2、当try或catch中含有return时,在try或catch执行完return之前的所有代码时,就会跳到finally执行代码,并且finally所更改的值都不会对try或catch里的值产生任何影响,函数的返回值是在finally执行之前运行的。(finally没有return的前提下)
3、不论try、catch中是否有return,只要finally中含有return,当执行到finally的return时,就会直接打断跳回try、catch里的return的函数,即是程序提前退出。并且finally做出值的更改将生效,返回给调用者。
4、只要try、catch、finally中任一含有return,主函数的return就会失效。
三、代码测试
自定义异常类
MyException.java
package exception;
public class MyException extends Exception {
private static final long serialVersionUID = 1L;
public MyException()
{
}
public MyException(String message) {
super(message);//调用父类的构造函数
}
}
异常检查类
MyETest.java
package exception;
public class MyETest {
public void sum(int x) throws MyException{
if(x>3){
throw new MyException("错误,x>3");
}
}
}
顺序测试类
FinallyTest.java
package exception;
public class FinallyTest
{
public static void main(String[] args) {
System.out.println(test1());
System.out.println(test2());
System.out.println(test3());
System.out.println(test4());
System.out.println(test5());
System.out.println(test6());
}
//情况一 try{} catch(){}finally{} return;
static int test1()
{
System.out.println("情况1:");
int x = 4;
try{
++x;
MyETest mye =new MyETest();
mye.sum(x);
}catch(MyException e){
System.out.println("x>3,有错误");
}finally{
++x;
System.out.println("finally="+x);
}
return x;
}
//情况二 try{ return; }catch(){} finally{} return;
static int test2()
{
System.out.println("情况2:");
int x = 1;
try{
++x;
MyETest mye =new MyETest();
mye.sum(x);
return ++x;//(包括return语句中的表达式运算)
}catch(MyException e){
System.out.println("x>3,有错误");
}finally{
++x;
System.out.println("finally="+x);
}
return x;
}
//情况3:try{ } catch(){return;} finally{} return;
static int test3()
{
System.out.println("情况3:");
int x = 4;
try{
++x;
MyETest mye =new MyETest();
mye.sum(x);
}catch(MyException e){
System.out.println("x>3,有错误");
return x;
}finally{
++x;
System.out.println("finally="+x);
}
return x;
}
//情况4:try{ return; }catch(){} finally{return;}
static int test4()
{
System.out.println("情况4:");
int x = 1;
try{
++x;
MyETest mye =new MyETest();
mye.sum(x);
return x;
}catch(MyException e){
System.out.println("x>3,有错误");
}finally{
++x;
System.out.println("finally="+x);
return x;
}
}
//情况5:try{} catch(){return;}finally{return;}
static int test5()
{
System.out.println("情况5:");
int x = 1;
try{
++x;
MyETest mye =new MyETest();
mye.sum(x);
}catch(MyException e){
System.out.println("x>3,有错误");
return x;
}finally{
++x;
System.out.println("finally="+x);
return x;
}
}
//情况6:try{ return;}catch(){return;} finally{return;}
static int test6()
{
System.out.println("情况6:");
int x = 1;
try{
++x;
MyETest mye =new MyETest();
mye.sum(x);
return x;
}catch(MyException e){
System.out.println("x>3,有错误");
return x;
}finally{
++x;
System.out.println("finally="+x);
return x;
}
}
}
测试结果:
参考网址:
有return的情况下try catch finally的执行顺序(最有说服力的总结)
总结就到此为止啦~~
【Java异常学习笔记系列】Java异常体系以及异常的基本知识
欢迎关注我的博客,一起学习讨论
要转载,请附上原文链接,作者:SnailMann
可以关注我的私人github: https://github.com/SnailMann,欢迎watch ,star, fork