zoukankan      html  css  js  c++  java
  • 关于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语句;

  • 相关阅读:
    Allow Zero Length 允许空字符串 ACCESS
    数据集永久字段的Visble 属性为何不起作用
    Microsoft Jet 数据库引擎 SQL 和 ANSI SQL 的比较
    Microsoft 数据访问组件 (MDAC) 的版本历史记录
    Windows 7 英文版操作系统中文软件乱码解决方法
    DBLookupComboBox 的初始值
    无法为更新定位行,一些值可能已在最后一次读取后已更改
    [hdu6428]Problem C. Calculate
    [hdu6437]Problem L. Videos
    [hdu6434]Problem I. Count
  • 原文地址:https://www.cnblogs.com/sun7897/p/8638602.html
Copyright © 2011-2022 走看看