关于try catch finally

一、try catch finally的初步理解

  首先,我们什么时候要用到try/catch和finally?  ——已知执行的代码有可能有异常的情况下

    try { //这里执行的代码如果出现异常,则立即跳到catch执行。} 

    catch { //除非try里面执行代码发生了异常,否则这里的代码不会执行 } 

    finally { //不管有没有异常,finally中的代码都会执行,可以理解为只要执行了try或者catch,就一定会执行 finally } 

二、try catch finally的执行顺序(无return)

    1.我们来看段代码

 1 public class Test01 {
 2     public static void main(String[] args) {
 3         int i = 1;
 4         test01(i);
 5     }
 6     
 7     public static void test01(int i) {
 8         try {
 9             i++;
10             System.out.println("try-----"+i);
11             i=1/0;//制造异常句子
12             i++;
13             System.out.println("try2-----"+i);
14         } catch (Exception e) {
15             i++;
16             System.out.println("catch-----"+i);
17         }finally {
18             i=5;
19             System.out.println("finally-----"+i);
20         }
21     }
22 }

    2.控制台输出结果为:

      

    3.总结:从输出结果可以看出,执行顺序为:try{} catch{} finally{} ;

      也就是先执行try{}(try-----2),try里面发生异常(i=i/0;),跳去执行catch(catch-----3),不管有没有发生异常都会执行的finally(finally-----5);

      (如果try里面没有异常将不执行catch,这里就不予以演示了)

三、try catch finally的执行顺序(带return),这里有两种情况

  第一种,return在try catch finally 后面

    1.我们来看段代码

 1 public class Test01 {
 2     public static void main(String[] args) {
 3         int i = 1;
 4         i=test01(i);
 5         System.out.println("main--------"+i);
 6     }
 7     
 8     public static int test01(int i) {
 9         try {
10             i++;
11             System.out.println("try-----"+i);
12         } catch (Exception e) {
13             i++;
14             System.out.println("catch----"+i);
15         }finally {
16             i++;
17             System.out.println("finally---"+i);
18         }
19         return i;
20     }
21 }

    2.控制台输出结果

      

    3.总结:从输出结果可以看出,执行顺序为:try{} /catch{} finally{} return;

      在这里没有制造异常,就正常执行,“i”的初始值是“1”,在try里面“i++”--这时候“i”的值是“2”,在到finally里面执行“i++”,这时候“i”的值是“3”;

      最后返回给方法返回的是“3”。

      这里也进一步说明了无论try{}里面有没有发生异常,finally{}里面的代码都会执行

  第二种,return在try catch 里面——重点

    1.我们来看段代码

 1 public class Test01 {
 2     public static void main(String[] args) {
 3         int i = 1;
 4         i=test01(i);
 5         System.out.println("main--------"+i);
 6     }
 7     
 8     public static int test01(int i) {
 9         try {
10             i++;
11             System.out.println("try-----"+i);
12             return i;
13         } catch (Exception e) {
14             i++;
15             System.out.println("catch----"+i);
16             return i;
17         }finally {
18             i=5;
19             System.out.println("finally---"+i);
20         }
21     }
22 }

    2.控制台输出结果为

      

    3.总结:从输出结果可以看出,执行顺序依然是:try{} /catch{} finally{} return;

      ①finally是无论如何都会执行的(打印了fianlly),所以就算try里面有return语句也不会直接返回。

      ②执行了finally之后,按道理来说“i”的值应该是“5”,为什么最后返回给main方法的值是“2”呢:

        个人猜测:这里返回的"i"不是原来的变量“i”,而是系统另外为try里面的“i值”定义了一个“i2”,返回的是“i2”,但是在这个时候“i”的值还是finally里面定义的“5”,然后在main方法里面又把“i2值”赋给了“i”,这时候"i"亦为“2”;

    4.注意:如果在finally里面添加return语句,那么将会直接返回fianlly里面的“i”,这时候main里面输出的“i”值为“5”。

      这也是进一步的说明了“不管有没有异常,finally中的代码都会执行”;那finally里面的代码执行了之后,便也执行了return语句,将不再执行try里面的return语句;

原文地址:https://www.cnblogs.com/sun7897/p/8638602.html