1.try-catch-finally中都没有return的情况
1.1 执行try-finally
public class FinallyTest1 {
@Test
public void test(){
try{
String str="12";
int i=Integer.parseInt(str);
System.out.println(1);
}catch(NumberFormatException e){
System.out.println(-1);
}finally{
System.out.println("test结束");
}
}
执行结果为
解析:
第一步:将str="12"转换为int类型的数据,由于str的字符串内容为整形,所以转换成功(没有触发catch)
String str=“12”;
int i=Integer.parseInt(str);
第二步:打印try中的1
System.out.println(1);
第三步:执行finally中的输出语句
System.out.println(“test结束”);
1.2 执行catch-finally
public class FinallyTest1 {
@Test
public void test(){
try{
String str="abc"; (同样是上面的那段代码,只是将“12”换成类“abc”)
int i=Integer.parseInt(str);
System.out.println(1);
}catch(NumberFormatException e){
System.out.println(-1);
}finally{
System.out.println("test结束");
}
}
执行结果为
解析:
第一步:将str="12"转换为int类型的数据,由于str的字符串内容为字符,所以转换不成功(触发catch)
String str=“12”;
int i=Integer.parseInt(str);
第二步:打印catch中的-1
System.out.println(-1);
第三步:执行finally中的输出语句
System.out.println(“test结束”);
2.try-catch中有return,finally中没有return的情况
public class FinallyTest2 {
public static void main(String[] args) {
int result = test("12");
System.out.println(result);
}
public static int test(String str) {
try {
Integer.parseInt(str);
return 1;
} catch (NumberFormatException e) {
return -1;
} finally {
System.out.println("test结束");
}
}
}
执行结果为
解析**:
首先,我们需要了解栈的概念:
栈:存函数的临时变量,即局部变量,函数返回时随时有可能被其他函数栈用。
所以说,当我们调用 “test()” 方法时,会先将return后面的表达式进行计算,得到的值存放在栈中。
第一步:在try中,将“12”转换为int类型,计算return后面的表达式,得到的值存放在栈中,但不返回!!!
try {
Integer.parseInt(str);
return 1;
}
第二步:执行finally中的打印“test结束”
finally {
System.out.println(“test结束”);
}
第三步:这时候执行return,将刚刚保存在栈中的值返回到main()中,并进行打印。
return 1;
重点就是:
当try-catch中有return,finally中没有return时,
会先计算try-catch的return后面表达式的值,将结果存放在栈中,
再执行finally内容
最后使用try或catch中的return返回我们刚刚保存在栈中的结果
3.try-catch-finally三者都有return
public class FinallyTest3 {
public static void main(String[] args) {
int result = test("12");
System.out.println(result);
}
public static int test(String str) {
try {
Integer.parseInt(str);
return 1;
} catch (NumberFormatException e) {
return -1;
} finally {
System.out.println("test结束");
return 0;
}
}
运行结果为
解析:
第一步:在try中,将“12”转换为int类型,计算return后面的表达式,得到的值存放在栈中,但不返回!!!
try {
Integer.parseInt(str);
return 1;
}
第二步:执行finally,打印“test()结束”,然后返回 “0”给main()方法(由于finally已经返回了,所以try不能返回了)。
finally {
System.out.println(“test结束”);
return 0;
}
第三步:main()方法得到返回值“0”,并打印“0”。
public static void main(String[] args) {
int result = test(“12”);
System.out.println(result);
}
重点就是:
当try-catch中有return,finally中也有return时,
会先计算try-catch的return后面表达式的值,将结果存放在栈中,
再执行finally内容,由于finally中的return先执行了,所以try或catch中的return执行不到了。