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。


相关文章
|
16天前
|
人工智能 JSON API
全网刷屏的 Jev 模型正式开放!一手实战测评 + 保姆级教程
全网爆火的 Jev 模型是什么?有什么用?怎么使用?怎么接入 AI 编程工具?效果真的好么?傻子可懂的 Jev 保姆级实战教程 + 项目实战测评来啦
8413 20
|
15天前
|
人工智能 并行计算 PyTorch
秋叶 ComfyUI 2026 整合包 v3.2 完整部署教程:Python 3.13 + Torch 2.13 全栈升级
秋叶aaaki ComfyUI 2026年8月整合包v3.2正式发布!全面升级Python 3.13.11、PyTorch 2.13.0+cu130及ComfyUI v0.30.2,原生支持MiniMax H3、Wan 2.2、Qwen-Image-2.1等2026主流音视频/图像模型,解压即用,无需环境配置。
2705 14
|
15天前
|
人工智能 测试技术 API
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
Jev是TypeSafe AI推出的“系统一模型”,不生成文本,专做毫秒级结构化决策:Choice(多选)、Score(打分)、Noul(是非概率)。响应快193倍、成本低444倍,适合工单路由、内容审核、测试定级等高频判断场景。
1972 4
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
|
13天前
|
人工智能 编解码 并行计算
MiniMax-H3 一键整合包技术文档:8G 显存运行 AI 漫剧制作 —— 角色替换 / 动作迁移 / 文图生视频部署与调参指南
MiniMax H3 是 MiniMax 开源的全模态视频生成模型,支持文/图/音/视多条件输入,输出最高2K、15秒带双声道音频视频。本文档详述其Int8量化版在8GB显存下的本地一键部署、三段式工作流(EDIT/REPLACE/CONTINUE)、参数调优及常见问题排查。(239字)
|
9天前
|
人工智能 Linux 开发者
【2026国内使用】Codex安装过程一篇讲透(Win/Mac/Linux全支持)
Codex是OpenAI推出的AI编程智能体,可读取本地项目、理解需求并自动修改代码。支持桌面GUI、命令行(CLI)及VS Code/Cursor插件三种形态,覆盖可视化操作、终端高效开发与编辑器无缝集成场景,助开发者用自然语言驱动编码全流程。(239字)
【2026国内使用】Codex安装过程一篇讲透(Win/Mac/Linux全支持)
|
4天前
|
人工智能 JSON Linux
【全网最详细】ComfyUI使用教程:下载+本地部署+配置+工作流搭建一篇搞定(2026最新版)
ComfyUI是一款免费开源的本地AI绘图工具,采用节点式工作流设计,支持文生图、图生图、局部重绘、放大、换脸等多种功能。可离线运行,依赖显卡加速,无需联网。支持自定义流程保存与分享,插件生态丰富,适合进阶用户。(239字)
|
9天前
|
人工智能 JSON 编解码
【2026最新版】ComfyUI本地部署教程,新手也能看懂!
ComfyUI是本地运行的AI绘画工具,采用节点式工作流设计:通过拖拽连接“加载模型”“提示词编码”“采样”“解码”等模块,实现高度可控的文生图。新手推荐使用秋叶整合包,一键启动、内置模型管理与插件安装器,轻松上手。(239字)

热门文章

最新文章