try{...}catch(){...}finally{...}语句你真的理解吗?

简介: try{...}catch(){...}finally{...}语句你真的理解吗?
/**
 * @desc: 探究try...catch...finally语句块
 * 六种模式:
 * (1)try{ ... } catch(){ ... }finally{ ... }  ... return;
 * (2)try{ ... return;}catch(){ ... } finally{ ... }  ... return;
 * (3)try{ ... } catch(){ ... return;} finally{ ... } ... return;
 * (4)try{ ... return;}catch(){ ... } finally{ ... return;}
 * (5)try{ ... } catch(){ ... return;}finally{ ... return;}
 * (6)try{ ... return;}catch(){ ... return;} finally{ ... return;}
 * @author: YanMingXin
 * @create: 2021/8/10-10:16
 **/
public class TryTest {
    /**
     * 常量1
     */
    public static final String s1 = "Hello";
    /**
     * 常量2
     */
    public static final String s2 = "World";
    /**
     * try{ ... } catch(){ ... }finally{ ... }  ... return;
     *
     * @return
     */
    public static String model1() {
        String s = new String();
        try {
            s = s1 + s2;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println("finally " + s);
        }
        return s;
    }
    public static String model1HaveException() {
        String s = new String();
        try {
            s = s1 + s2;
            int i = 2 / 0;
        } catch (Exception e) {
            System.err.println("model1异常信息");
            e.printStackTrace();
        } finally {
            System.out.println("finally " + s);
        }
        return s;
    }
    /**
     * try{ ... return;}catch(){ ... } finally{ ... }  ... return;
     *
     * @return
     */
    public static String model2() {
        String s = new String();
        try {
            s = s1 + s2;
            return s;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println("finally " + s);
        }
        return s;
    }
    public static String model2HaveException() {
        String s = new String();
        try {
            s = s1 + s2;
            int i = 2 / 0;
            return s;
        } catch (Exception e) {
            System.err.println("model2异常信息");
            e.printStackTrace();
        } finally {
            System.out.println("finally " + s);
        }
        return s;
    }
    /**
     * try{ ... } catch(){ ... return;} finally{ ... } ... return;
     *
     * @return
     */
    public static String model3() {
        String s = new String();
        try {
            s = s1 + s2;
            //return s;  与最后的return冲突
        } catch (Exception e) {
            e.printStackTrace();
            return s;
        } finally {
            System.out.println("finally " + s);
        }
        return s;
    }
    public static String model3HaveException() {
        String s = new String();
        try {
            s = s1 + s2;
            int i = 1 / 0;
            //return s;  与最后的return冲突
        } catch (Exception e) {
            System.err.println("model3异常信息");
            e.printStackTrace();
            return s;
        } finally {
            System.out.println("finally " + s);
        }
        return s;
    }
    /**
     * try{ ... return;}catch(){ ... } finally{ ... return;}
     *
     * @return
     */
    public static String model4() {
        String s = new String();
        try {
            s = s1 + s2;
            return s;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println("finally " + s);
            return s;
        }
        //return s; 与finally的return冲突
    }
    public static String model4HaveException() {
        String s = new String();
        try {
            s = s1 + s2;
            int i = 5 / 0;
            return s;
        } catch (Exception e) {
            System.err.println("model4异常信息");
            e.printStackTrace();
        } finally {
            System.out.println("finally " + s);
            return s;
        }
        //return s; 与finally的return冲突
    }
    /**
     * try{ ... } catch(){ ... return;}finally{ ... return;}
     *
     * @return
     */
    public static String model5() {
        String s = new String();
        try {
            s = s1 + s2;
        } catch (Exception e) {
            e.printStackTrace();
            return s;
        } finally {
            System.out.println("finally " + s);
            return s;
        }
    }
    public static String model5HaveException() {
        String s = new String();
        try {
            s = s1 + s2;
            int i = 2 / 0;
        } catch (Exception e) {
            System.err.println("model5异常信息");
            e.printStackTrace();
            return s;
        } finally {
            System.out.println("finally " + s);
            return s;
        }
    }
    /**
     * try{ ... return;}catch(){ ... return;} finally{ ... return;}
     *
     * @return
     */
    public static String model6() {
        String s = new String();
        try {
            s = s1 + s2;
            return s;
        } catch (Exception e) {
            e.printStackTrace();
            return s;
        } finally {
            System.out.println("finally " + s);
            return s;
        }
    }
    public static String model6HaveException() {
        String s = new String();
        try {
            s = s1 + s2;
            int i = 2 / 0;
            return s;
        } catch (Exception e) {
            System.err.println("model6异常信息");
            e.printStackTrace();
            return s;
        } finally {
            System.out.println("finally " + s);
            return s;
        }
    }
    public static void main(String[] args) {
        System.out.println("model1无异常:");
        System.out.println(model1());
        System.out.println("model1有异常:");
        System.out.println(model1HaveException());
        System.out.println("model2无异常:");
        System.out.println(model2());
        System.out.println("model2有异常:");
        System.out.println(model2HaveException());
        System.out.println("model3无异常:");
        System.out.println(model3());
        System.out.println("model3有异常:");
        System.out.println(model3HaveException());
        System.out.println("model4无异常:");
        System.out.println(model4());
        System.out.println("model4有异常:");
        System.out.println(model4HaveException());
        System.out.println("model5无异常:");
        System.out.println(model5());
        System.out.println("model5有异常:");
        System.out.println(model5HaveException());
        System.out.println("model6无异常:");
        System.out.println(model6());
        System.out.println("model6有异常:");
        System.out.println(model6HaveException());
    }
}
复制代码

运行结果:

model1无异常:
finally HelloWorld
HelloWorld
model1有异常:
finally HelloWorld
HelloWorld
model2无异常:
finally HelloWorld
HelloWorld
model2有异常:
finally HelloWorld
HelloWorld
model3无异常:
finally HelloWorld
HelloWorld
model3有异常:
finally HelloWorld
HelloWorld
model4无异常:
finally HelloWorld
HelloWorld
model4有异常:
finally HelloWorld
HelloWorld
model5无异常:
finally HelloWorld
HelloWorld
model5有异常:
finally HelloWorld
HelloWorld
model6无异常:
finally HelloWorld
HelloWorld
model6有异常:
finally HelloWorld
HelloWorld
model1异常信息
java.lang.ArithmeticException: / by zero
  at org.ymx.test0810.TryTest.model1HaveException(TryTest.java:49)
  at org.ymx.test0810.TryTest.main(TryTest.java:234)
model2异常信息
java.lang.ArithmeticException: / by zero
  at org.ymx.test0810.TryTest.model2HaveException(TryTest.java:81)
  at org.ymx.test0810.TryTest.main(TryTest.java:239)
model3异常信息
java.lang.ArithmeticException: / by zero
  at org.ymx.test0810.TryTest.model3HaveException(TryTest.java:115)
  at org.ymx.test0810.TryTest.main(TryTest.java:244)
model4异常信息
java.lang.ArithmeticException: / by zero
  at org.ymx.test0810.TryTest.model4HaveException(TryTest.java:150)
  at org.ymx.test0810.TryTest.main(TryTest.java:249)
model5异常信息
java.lang.ArithmeticException: / by zero
  at org.ymx.test0810.TryTest.model5HaveException(TryTest.java:184)
  at org.ymx.test0810.TryTest.main(TryTest.java:254)
model6异常信息
java.lang.ArithmeticException: / by zero
  at org.ymx.test0810.TryTest.model6HaveException(TryTest.java:218)
  at org.ymx.test0810.TryTest.main(TryTest.java:259)
Process finished with exit code 0
复制代码

结论:

1、不管有没有出现异常,finally块中代码都会执行;

2、当try和catch中有return时,finally仍然会执行;

3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;

4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。

任何执行try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的,编译器把finally中的return实现为一个warning。


相关文章
|
存储 NoSQL Java
Elasticsearch Nested 选型,先看这一篇!
1、关于Nested 问题 上次讲解了Elasticsearch 数据建模之后,很多同学反馈问题: Q1:用nested做嵌套文档,对嵌套文档的字段做查询,只要主文档下一个嵌套文档符合要求,就会把主文档以及下面的所有的嵌套文档都查出来,实际我只需要符合要求的嵌套文档。这个用nested可以做吗? Q2:请教个问题 这个nested 是只要用这个字段类型就影响性能还是说当只有用这个字段类型去筛选才影响性能? Q3:Elasticsearch Nested 取一条数据 怎么搞? Q4:nested聚合查询等,导致jvm内存剧增,出现长时间的full GC,如何破? 介于此,非常有必要将
Elasticsearch Nested 选型,先看这一篇!
|
存储 NoSQL 分布式数据库
大数据存储技术(4)—— NoSQL数据库
大数据存储技术(4)—— NoSQL数据库
2194 1
|
机器学习/深度学习 并行计算 程序员
成功解决 This graphics driver could not find compatible graphics hardware. You maycontinue installation,
成功解决 This graphics driver could not find compatible graphics hardware. You maycontinue installation,
成功解决 This graphics driver could not find compatible graphics hardware. You maycontinue installation,
|
敏捷开发 弹性计算 缓存
阿里云云效产品使用合集之流水线服务连接管理一直在加载中,是什么导致的
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
机器学习/深度学习 人工智能 编解码
AI Earth首套气象数据集(ERA5-Land )开放使用
基于达摩院在深度学习、计算机视觉、地理空间分析等方向上的技术积累,结合阿里云强大算力支撑,提供多源遥感对地观测数据的云计算分析服务,用数据感知地球世界,让AI助力科学研究。
AI Earth首套气象数据集(ERA5-Land )开放使用
|
移动开发 前端开发 数据安全/隐私保护
 iOS代码混淆-从入门到放弃
代码混淆可以对函数名、变量名、类名等关键代码进行重命名和混淆处理,降低代码的可读性,增加逆向工程的难度,从而有效保护应用程序的安全性,减少开发者的经济损失。
|
传感器 编解码 测试技术
《软件测试技术实战 设计、工具及管理》联载-37
《软件测试技术实战 设计、工具及管理》联载-37
130 0
《软件测试技术实战 设计、工具及管理》联载-37
|
Python
LeetCode 435. 无重叠区间
给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
219 0
|
Python
LeetCode 349. Intersection of Two Arrays
给定两个数组,编写一个函数来计算它们的交集。
213 0
LeetCode 349. Intersection of Two Arrays
分布式事务Seata【三】分布式事务协议
在分布式系统里,每个节点都可以知晓自己操作的成功或者失败,却无法知道其他节点操作的成功或失败。当一个事务跨多个节点时,为了保持事务的原子性与一致性,而引入一个协调者来统一掌控所有参与者的操作结果,并指示它们是否要把操作结果进行真正的提交或者回滚(rollback)。
427 0
分布式事务Seata【三】分布式事务协议