总结:
1,try、catch、finally语句块中(有返回值的),要么在整个语句结束加return,要么就在finally中加return,但编译器会报警告;
2,所有的try和catch中有return时,都会先执行finally代码;
3,如果finally中含有return,一定会返回这个return(可以理解为覆盖了try或catch中的return)。
用例Ⅰ:try catch finally都无return,整个try catch语句块后面接return
public class Demo10{
public static String s="0";
public static String foo(int i) {
try {
System.out.println("try执行");
//如果i为1则抛出异常
if(i==1) {
s+="1";
throw new Exception();
}
s+="2";
} catch (Exception e) {
System.out.println("catch执行");
s+="3";
}finally {
System.out.println("finally执行");
s+="4";
}
return s;
}
public static void main(String[] args) {
System.out.println(foo(0));
}
}
执行结果:
try执行
finally执行
024
这个没什么说的,按照平常顺序执行。
finally执行
024
这个没什么说的,按照平常顺序执行。
用例②:try和finally中都有return。
public class Demo10{
public static String s="0";
public static String foo(int i) {
try {
System.out.println("try执行");
//如果i为1则抛出异常
if(i==1) {
s+="1";
throw new Exception();
}
s+="2";
return s;
} catch (Exception e) {
System.out.println("catch执行");
s+="3";
}finally {
System.out.println("finally执行");
s+="4";
return s;
}
}
public static void main(String[] args) {
System.out.println(foo(0));
}
}
执行结果:
try执行
finally执行
024
finally执行
024
断点分析过程:执行到try中的return时,调到finally中进行执行,一直到finally中的return返回。是否可以理解为后者的finally覆盖了try中的finally?存疑。
用例Ⅲ:try中存在return抛出异常,catch中无return,finally中有return。
public class Demo10{
public static String s="0";
public static String foo(int i) {
try {
System.out.println("try执行");
//如果i为1则抛出异常
if(i==1) {
s+="1";
throw new Exception();
}
s+="2";
return s;
} catch (Exception e) {
System.out.println("catch执行");
s+="3";
}finally {
System.out.println("finally执行");
s+="4";
return s;
}
}
public static void main(String[] args) {
System.out.println(foo(1));
}
}
执行结果:
try执行
catch执行
finally执行
0134
catch执行
finally执行
0134
断点分析过程:try中虽然有在抛出异常后的return语句,
但是不会执行。依次执行catch、finally,直到finally中的return返回。
用例Ⅳ:catch带有return,finally中有return。
public class Demo10{
public static String s="0";
public static String foo(int i) {
try {
System.out.println("try执行");
//如果i为1则抛出异常
if(i==1) {
s+="1";
throw new Exception();
}
s+="2";
return s;
} catch (Exception e) {
System.out.println("catch执行");
s+="3";
return s;
}finally {
System.out.println("finally执行");
s+="4";
return s;
}
}
public static void main(String[] args) {
System.out.println(foo(1));
}
}
执行结果:
try执行
catch执行
finally执行
0134
断点分析:catch中执行到return时,跳到finally执行,直到finally的return返回。
catch执行
finally执行
0134
断点分析:catch中执行到return时,跳到finally执行,直到finally的return返回。