用代码的方式可能比较直观,虽然比较粗糙,但是有用!
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语句中的值返回。 * * */ }