先说结论:
1.不论try 或者catch中有没有return,finally中的代码都会执行
2.不论try或者catch中有没有return,只要finally中有return,那么他们里面的return语句都不执行,只执行finally中的return
3.不论哪个return执行,都会在最后执行,也就是说,符合语法的代码都会执行完才会执行return
4.return执行的优先级: finally中的return>try中的==catch中的>finally之后的return
以下是验证
情况一
//情况一 try{} catch(){}finally{}, 当三个里面都没有return
// 正常执行时,顺序是:try中的代码,然后是finally中的代码,因为没有抛出异常,所以catch中的代码并不会执行;
// 非正常执行:也就是try中出现了异常 ,顺序是try中出现异常的地方之前的代码执行,然后是catch中代码执行,再然后是finally中的代码执行,try其余的代码不会执行
public class demo01 {
public static void main(String[] args) {
int i=1;
try {
System.out.println(i);
System.out.println(i/0);
System.out.println("hahahah");
}
catch (Exception e)
{
e.printStackTrace();
System.out.println("出异常了");
}
finally {
System.out.println("我是finally");
}
}
}
情况二
package test_2021_1_6.try_catch_finally;
//情况二 try{ return; }catch(){} finally{} return;
//正常执行:程序执行try块中return之前(包括return语句中的表达式运算,如我写的 i+2 已经计算出了应该返回3,但是还没有返回)代码,而是执行再执行finally块,最后执行try中return;
//finally块之后的语句return,因为程序在try中已经return所以不再执行。
//非正常执行:抛出了异常: 还是从try中开始,但是从出现异常代码语句开始后面的语句都不在执行,在这里也就是System.out.println(i/0);之后代码都不执行,跳到catch中,执行完代码,接着执行finally代码,然后执行最后的return
public class demo02 {
public static void main(String[] args) {
//System.out.println(method01());
System.out.println(method02());
}
//不会出现异常
public static int method01() {
int i=1;
try {
i++;
System.out.println("111111111111111111");
return i+5;
}
catch (Exception e)
{
e.printStackTrace();
System.out.println("出异常了");
}
finally {
System.out.println("我是finally");
}
return i;
}
//会出现异常
public static int method02() {
int i=1;
try {
i++;
System.out.println(i/0);
System.out.println("222222222222222");
return i+6;
}
catch (Exception e)
{
e.printStackTrace();
System.out.println("出异常了");
}
finally {
System.out.println("我是finally");
}
return i;
}
}
情况三
/*
情况三 try{ } catch(){return;} finally{} return;
*/
public class demo03 {
public static void main(String[] args) {
// System.out.println(method01());
System.out.println(method02());
}
//正常执行的情况下,catch中的语句不会执行,finally后的return执行
public static int method01() {
int i=1;
try {
i++;
System.out.println("111111111111111111");
}
catch (Exception e)
{
e.printStackTrace();
System.out.println("出异常了");
return i+5;
}
finally {
System.out.println("我是finally");
}
return i;
}
//会出现异常,try中的异常前的的代码--》catch中return前的代码-》finally中的代码---》catch中的return ,finally后的return不执行
public static int method02() {
int i=1;
try {
i++;
System.out.println(i/0);
System.out.println("222222222222222");
}
catch (Exception e)
{
e.printStackTrace();
System.out.println("出异常了");
return i+6;
}
finally {
System.out.println("我是finally");
}
return i;
}
}
情况四
/*
情况四 try{ return; }catch(){} finally{return;}
程序执行try块中return之前(包括return语句中的表达式运算)代码;
再执行finally块,因为finally块中有return所以提前退出。
*/
public class demo04 {
public static void main(String[] args) {
// System.out.println(method01());
System.out.println(method02());
}
//不会出现异常 ,当try和finally都有return时,执行finally的,try中的不执行
public static int method01() {
int i=1;
try {
System.out.println("111111111111111111");
return i+5;
}
catch (Exception e)
{
e.printStackTrace();
System.out.println("出异常了");
}
finally {
System.out.println("我是finally");
return i+1;
}
}
//会出现异常,那么try后面的代码都不会执行,finally中的return执行
public static int method02() {
int i=1;
try {
System.out.println(i/0);
System.out.println("222222222222222");
return i+6;
}
catch (Exception e)
{
e.printStackTrace();
System.out.println("出异常了");
}
finally {
System.out.println("我是finally");
return 5;
}
}
}
情况五
/*
try{} catch(){return;}finally{return;}
程序执行catch块中return之前(包括return语句中的表达式运算)代码;
再执行finally块,因为finally块中有return所以提前退出。
*/
public class demo05 {
public static void main(String[] args) {
//System.out.println(method01());
System.out.println(method02());
}
//不会出现异常
public static int method01() {
int i=1;
try {
i++;
System.out.println("111111111111111111");
}
catch (Exception e)
{
e.printStackTrace();
System.out.println("出异常了");
return i+5;
}
finally {
System.out.println("我是finally");
return i;
}
}
//会出现异常
public static int method02() {
int i=1;
try {
i++;
System.out.println(i/0);
System.out.println("222222222222222");
}
catch (Exception e)
{
e.printStackTrace();
System.out.println("出异常了");
return i+6;
}
finally {
System.out.println("我是finally");
return i;
}
}
}
情况六
/*
try{ return;}catch(){return;} finally{return;}
程序执行try块中return之前(包括return语句中的表达式运算)代码;
有异常:执行catch块中return之前(包括return语句中的表达式运算)代码;
则再执行finally块,因为finally块中有return所以提前退出。
无异常:则再执行finally块,因为finally块中有return所以提前退出。
*/
public class demo06 {
public static void main(String[] args) {
}
public static int method01() {
int i=1;
try {
i++;
System.out.println("111111111111111111");
return i+1;
}
catch (Exception e)
{
e.printStackTrace();
System.out.println("出异常了");
return i+2;
}
finally {
System.out.println("我是finally");
return i+3;
}
}
//会出现异常
public static int method02() {
int i=1;
try {
i++;
System.out.println(i/0);
System.out.println("222222222222222");
return i+1;
}
catch (Exception e)
{
e.printStackTrace();
System.out.println("出异常了");
return i+2;
}
finally {
System.out.println("我是finally");
return i+3;
}
}
}