try、catch、finally块的执行流程(带return语句)
用代码的方式可能比较直观,虽然比较粗糙,但是有用!
package com.test;
import java.util.ArrayList;
import java.util.List;
public class testException {
/**
* 主要探究try catch finally中的实际应用
* */
public static void main(String[] args) {
//执行第一种情况
// int i1_return = testReturn1();
// System.out.println("i1_return : "+i1_return);
//执行第二种情况
// int i2_return = testReturn2();
// System.out.println("i2_return : "+i2_return);
//执行第三种情况
// int i3_return = testReturn3();
// System.out.println("i3_return : "+i3_return);
//执行第四种情况
List list_return = testReturn4();
System.out.println("list_return : "+list_return);
}
static int testReturn1(){
//1、try中有return ,catch中无异常可捕获
//执行结果为:
/**
* 运行结果:
* try : 2
* finally : 3
* i_return : 2
* 通过程序运行我们可以发现,程序是这样运行的:
* 先执行try 如果try中有对变量的操作,并且试图将此变量返回,会将此变量的值暂存,等下面的catch(有可捕获异常的情况下)、finally块执行完,
* 将暂存的返回值返回,并不会再执行finally后面的代码
* tips:return语句后不能再跟程序代码
* */
int i = 1;
try{
i++;
System.out.println("try : "+i);
return i;
}
catch (Exception e){
i++;
System.out.println("catch : "+i);
}
finally {
i++;
System.out.println("finally : "+i);
}
System.out.println("asdasda");
return 56757;
}
//2、try中有return、catch中能捕获并且catch中有return
static int testReturn2(){
int i = 1;
try{
i++;
System.out.println("try : "+i);
int i1 = i/0;
return i;
}catch (Exception e){
i++;
System.out.println("catch : "+i);
return i;
}finally {
i++;
System.out.println("finally : "+i);
}
/**
* 程序运行结果:
* try : 2
* catch : 3
* finally : 4
* i2_return : 3
*
* 如果方法中也有return语句的话,并且try块和catch块中都有return语句,编译的时候就会出错,反之try块和catch块单独有return语句的时候,方法中可以写return语句。
* 或者如果finally块中有return语句的话,也会编译错误。
* 我的理解是:finally块中有return语句的话肯定会执行,如果finally中没有,try、catch中有return语句的话,必定有一个会执行。
*
* 好了,接着讨论
* 如果try块和catch块中都有return语句的话,肯定的,会返回catch块中的return语句。
* 但是这里我要说明的是:
* try块中的return语句也是执行了的,只不过执行到catch块中的时候被覆盖了而已。
* 其实,这里最大的发现是,方法中的return语句在一定条件下不能出现的问题,有了解的朋友,可以在评论区发表自己的看法。
* */
}
//finally块中有return语句
static int testReturn3(){
int i = 1;
try{
i++;
System.out.println("try : "+i);
int i1 = i/0;
return i;
}catch (Exception e){
i++;
System.out.println("catch : "+i);
return i;
}finally {
i++;
System.out.println("finally : "+i);
return i;
}
// return i;(不能出现)
/**
* 运行结果:
* try : 2
* catch : 3
* finally : 4
* i3_return : 4
* 与上面catch块中有return语句类似,try、catch块中的return语句执行了,只不过被finally块中的覆盖了。
* */
}
static List testReturn4(){
List<Integer> list = new ArrayList<Integer>();
try {
list.add(1);
System.out.println("try : "+list);
int i = 1/0;
return list;
}catch (Exception e){
list.add(2);
System.out.println("catch : "+list);
}finally {
list.add(3);
System.out.println("finally : "+list);
}
return list;
}
/**
* try : [1]
* catch : [1, 2]
* finally : [1, 2, 3]
* list_return : [1, 2, 3]
*
* 集合类的情况与变量的情况不同,
* 如果返回的类型是集合类型会将最后执行的return语句中的值返回。
*
* */
}

查看6道真题和解析