• 关于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语句;

  • 相关阅读:
    centos8 将SSSD配置为使用LDAP并要求TLS身份验证
    Centos8 搭建 kafka2.8 .net5 简单使用kafka
    .net core 3.1 ActionFilter 拦截器 偶然 OnActionExecuting 中HttpContext.Session.Id 为空字符串 的问题
    Springboot根据不同环境加载对应的配置
    VMware Workstation12 安装 Centos8.3
    .net core json配置文件小结
    springboot mybatisplus createtime和updatetime自动填充
    .net core autofac依赖注入简洁版
    .Net Core 使用 redis 存储 session
    .Net Core 接入 RocketMQ
  • 原文地址:https://www.cnblogs.com/sun7897/p/8638602.html
Copyright © 2020-2023  润新知