Java基础之try catch finally的原理

Java try-catch 捕获异常真的会影响性能吗? 综上所述,Java try-catch 捕获异常并不会对程序性能造成显著的影响,尤其是在现代的 Java 虚拟机中。在编写代码时,我们应该从程序设计角度出发,正确使用 try-catch 语句,以便提高代码的可读性、可维护性和健壮性。如果我们需要针对性能进行优化,可以采用一些技巧和方法,如减少 try-catch 的嵌套层数、将 try-catch 块放在外层循环中等。 阅读详情

先看一段代码

public static int test() {
        int i = 0;
        try {
            System.out.println("业务执行");         // 标记1
            i = 1 / 0;
            System.out.println("业务执行完成");
            i++;                                  // 标记2
            return i;
        } catch (Exception e) {
            System.out.println("捕捉异常");        //  标记3
            i++;                                 //  标记4
            return i;
        } finally {
            System.out.println("释放资源");       //  标记5
            i++;                                //  标记6
            return i;
        }
    }

带着问题找答案

问题1:try {} 里面的代码没有抛出异常,正确的执行了 try {} 代码中的 return 指令,finally {} 中的代码会被执行,那底部的执行原理是怎样的呢。

问题2:try {} 里面的代码抛出了异常,接着会执行 catch {} 中的代码且 catch {} 中的代码没有抛出异常正确的执行了 return 指令,执行 finally 中的代码也会被执行,那底部的执行原理是怎样的呢。

问题3:try {} 里面的代码抛出了异常,接着会执行 catch {} 中的代码且 catch {} 中的代码也抛出了异常,执行 finally 中的代码也会被执行,那底部的执行原理是怎样的呢。

以上三个问题总结如下图

通过javap查看class文件字节码,命令为javap -c -s -v -l TestMain.class

这里只是帖出了 test 方法有关的字节码,

重点(看懂这三点,也就明白了 try catch finally 的底层原理)

  • 绿色表示 try {} 中的代码,红色表示 catch {} 中的代码,蓝色表示 finally {} 中的代码。
  • finally {} 中代码的字节码别编织到了三个地方(看懂这一点,也就明白了 try catch finally 的底层原理)
  • Exception table,列表中记录了从字节码 from 到字节码 to,如果执行期间出现异常 代码分支应该如何走

字节码如下

public static int test();

descriptor: ()

flags: ACC_PUBLIC, ACC_STATIC

Code:

stack=2, locals=4, args_size=0

0: iconst_0

1: istore_0

------实际运行中 try {} 中的字节码 begin --------

2: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;

5: ldc #3 // String 业务执行

7: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V

10: iconst_1

11: iconst_0

12: idiv

13: istore_0

14: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;

17: ldc #5 // String 业务执行完成

19: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V

22: iinc 0, 1

25: iload_0

26: istore_1

27: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;

30: ldc #6 // String 释放资源

32: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V

35: iinc 0, 1

38: iload_0

39: ireturn // 对应着代码中的标记 2

------实际运行中 try {} 中的字节码 end----------

------实际运行中 catch {} 中的字节码 begin --------

40: astore_1

41: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;

44: ldc #8 // String 捕捉异常

46: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V

49: iinc 0, 1

52: iload_0

53: istore_2

54: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;

57: ldc #6 // String 释放资源

59: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V

62: iinc 0, 1

65: iload_0

66: ireturn // 对应着代码中的标记 4

------实际运行中 catch {} 中的字节码 end --------

------实际运行中 finally {} 中的字节码 begin --------

67: astore_3

68: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;

71: ldc #6 // String 释放资源

73: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V

76: iinc 0, 1

79: iload_0

80: ireturn // 对应着代码中的标记 6

------实际运行中 finally {} 中的字节码 end --------

Exception table:

from to target type

2 27 40 Class java/lang/Exception // 2 到 26 之间的代码是 try {} 中的代码,运行期间如果抛出 Exception 则跳转到 40,也就是 catch {} 中代码的第一行

2 27 67 any // 2 到 26 之间的代码是 try {} 中的代码,运行期间没有抛出异常则跳转到 67 也就是 finally {} 中代码的第一行

40 54 67 any // 40 到 53 之间的代码是 catch {} 中的代码,运行期间如果抛出异常则跳转到 67 也就是 finally {} 中代码的第一行

参考文章

Java基础之try catch finally的原理 - 掘金

【java】java try catch finally 字节码原理 finally语句为何一定会执行 以前只知道有这么回事,但是却不知道原理,在本章节了解到相关原理。本章出自《深入理解JVM字节码 》Java中有一个非常重要的内容是try-catch-finally 的执行顺序和返回值问题,大部分书里说过finally 一定会执行,但是为什么是这样?下面来看看try-catch-finally 这个语法糖背后的实现原理。下面是一个简单的try-catch的例子。 对应的字节码如下第0~1行: aload_0指令加载this,随后使用invokevirtual 指令调用try[tOut1 方法,关于invok 阅读详情

相关推荐

Fedproto:原型聚合的联邦学习框架

文中说明,联邦学习通过计算传递梯度聚合模型时,客户端之间的异构性通常会阻碍模型优化收敛和泛化性能。故本文提出新的FedProto框架,将梯度替换成为原型,通过计算、聚合从不同客户端收集到的本地原型,然后将全局原型发送回所有客户端,以规范本地模型的训练。对每个客户机进行局部训练的目的是最小化对本地数据的分类损失,同时保持生成的本地原型足够接近相应的全局原型(损失函数最小+正则)。什么是原型?文中提到:“

weixin_47754029的博客 2650

Java try/catch的实现原理与性能

首先,try/catch怎么写呢?如下图所示: 那么try catch到底在JVM底层是如何实现的呢? 首先明确一个概念,在Java中如果不发生异常的话,try/catch其实不会造成任何性能损失。这是如何做到的呢 首先,在Java文件编译成为字节码之后,其实正常流程与异常处理部分是分开来的,如下图所示: ...

nanchengyu的博客 5369

V.PhyloMaker实战:从物种列表到维管束植物系统发育树的完整流程

本文详细介绍了使用V.PhyloMaker工具包,从物种列表快速构建维管束植物系统发育树的完整实战流程。内容涵盖R包安装、物种名标准化、核心函数phylo.maker的三种构建方案选择、结果树的可视化与导出,以及与picante包的联动分析,为生态学和生物地理学研究提供了高效解决方案。

weixin_29057237的博客 379

JDK8 学习笔记

JDK7 try-catch 支持处理多异常 try{ ...; }catch( Exc | Exc ){ //一个catch 捕获多个异常,字节码文件跟小 } 数字类型 支持下划线 int num = 123_345; float num2 = 222+33F; long num3 = 123_000_111L; switch 支持 string switch(){ case "java": break; ....; ...

MXqihang的博客 1110

Ships Dataset:解锁海洋探索的数字宝库

在海上交通管理中,通过对船舶的持续跟踪,可以及时发现船舶的异常行为,如偏离航线、超速等,保障海上航行的安全。例如,通过分析船舶的航行数据和位置信息,合理安排船舶的停靠时间和装卸货物顺序,避免港口拥堵,提高船舶的周转率。同时,还精确标注了船舶在图像中的位置坐标,通过这些坐标,我们可以准确地定位船舶在图像中的具体位置,为后续的分析和处理提供了精确的依据。从繁忙运输货物的货船,到承载着能源使命的油轮,再到穿梭于海洋寻找鱼群的渔船 ,每一种船舶都有着独特的外形和功能,在数据集中留下了它们的身影。

qq_38220914的博客 1267

聊一聊固态电池和钠离子电池新技术

总之,固态电池是一种“安全又高效的未来电池”,它的好处非常明显,但目前还处于研发阶段,离普及还有一段距离。未来,这两种技术可能会与锂离子电池并存,分别满足不同的市场需求。我尝试用最通俗易懂的语言将复杂的技术讲给大家听。钠离子电池和锂离子电池的工作原理很相似,但它用的是。固态电池和钠离子电池是两种正在研发和推广的。,它们有潜力解决现有锂离子电池的部分缺点。,而不是锂(Li)。

weixin_33324696的博客 3334

开发易忽视的问题:Java try catch实现原理

1/0导致是Java通过虚拟机执行引擎的一种内建检查机制。此检查符合Java语言的设计目标,即提供一种鲁棒、安全的编程环境,以减少运行时错误和不可预见的行为。

2301_78976656的博客 982

TI DSP的 FFT与IFFT库函数的使用测试

/** * Copyright (C) 2013 Guangzhou Tronlong Electronic Technology Co., Ltd. - www.tronlong.com * * @file dsplib_fft.c * * @brief Example application main file. * This application will run FFT performance test. * * @author Tronlong <support@tron.

ToneChip的专栏,一个传统的嵌入式码农,裸机编程 2678

【Java基础-41.1】深入理解 Java 中的 try-catch-finally:异常处理的原理与实践

是 Java 异常处理的核心机制,它能够帮助开发者捕获和处理异常,同时确保资源的正确释放。通过合理地使用,可以显著提高程序的健壮性和可维护性。在实际开发中,遵循异常处理的最佳实践,如避免空的 catch 块、优先使用等,能够使代码更加清晰、可靠。希望本文能够帮助你深入理解的工作原理及其应用场景,从而编写出更加健壮的 Java 程序。

weixin_39033358的博客 2169

RISC-V CPU设计(三)---多周期CPU的设计与实现

基本情况 本多周期CPU支持RV32I指令集(fence,ecall,ebreak除外),已通过部分指令的测试,如代码有bug,欢迎指出。 模块划分 代码将CPU划分为以下几个模块: 1.控制单元:ControlUnit 用于产生控制信号,是CPU的大脑,指挥中枢。 2.分支决策单元:BranchUnit 用于决定B型指令是否发生跳转 3.立即数单元:ImmUnit 用于从指令中解析出立即数. 4.寄存器堆:RegisterFile RISC-V的32个寄存器,其中x0寄存器恒为0,不可更改。 5.指令存储

qq_40268672的博客 5543

Python数据分析全流程指南:从数据采集到可视化呈现的实战解析

在数字化转型浪潮中,数据分析已成为企业决策的核心驱动力。Python凭借其丰富的生态库和简洁的语法,成为数据分析师的首选工具。本文将以实战案例为脉络,拆解数据分析全流程的关键环节,通过具体代码和场景说明如何用Python完成从数据采集到可视化呈现的完整链路。

这家伙很懒,什么都没有留下 1681

JAVA基础四(自动装箱,常量池;try catch finally,try里有return,finally还执行吗;JAVA多态的实现原理,java反射的作用与原理;泛型常用特点)

自动装箱在jdk1.5之前,如果你要定义一个value为100的Integer对象则需要如下定义: Integer i = new Integer(100); int intNum1=100;//普通变量 Integer intNum2 = intNum1;//自动装箱 int intNum3 = intNum2;//自动拆箱 Integer intNum4 = 100;//自动装箱 上面的代码中,intNum2为一个Integer类型的实例,intNum1为Java中的基础数据类型,将intNum1赋

wozhendeb的博客 188

Android 系统低内存lowmemorykiller关于阈值修改 minfreeAbsKbytes优化

在系统rom定制化开发中,在对于运行内存ram 1G和2G的设备中,对于内存使用高峰期时,minfreeAbsKbytes优化很关键 调整合理的minfree,让内存合理的使用很关键,接下来分析相关功能的实现

安卓兼职framework和app工程师的博客 524

JAVA之try{}catch{}finally{}

前言 最近遇到一个try->catch->finally->return问题的变式,由于只知道是这么个顺序,但不知其原理,所以问题稍微变下就答不上来了。现在从字节码角度来分析这个问题。 代码 Sample1 public class TryCatchTest { public static void main(String[] args) { System.out.println(finallyTest()); } public static

ooaash的博客 560

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

java异常 处理后变化_Java 进阶之异常处理

本文的主要内容分为 Java 异常的定义、Java 异常的处理、JVM 基础知识(异常表、JVM 指令分类和操作数栈)及深入剖析 try-catch-finally 四部分(图解形式)。在深入剖析 try-catch-finally 部分会以字节码的角度分析为什么 finally 语句一定会执行。第三和第四部分理解起来可能会有些难度,不感兴趣的小伙伴可直接跳过。阅读更多关于 Angular、Typ...

weixin_42299756的博客 237

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

轻松看懂Java字节码

/ 今日科技快讯 /特斯拉公司首席执行官埃隆·马斯克在一封最新遭泄露的电子邮件中表示,该公司计划将今年第四季度电动汽车产量环比提高近20%,实现2020年总产量达到50万辆的目标...

郭霖 239

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Java基础最全最新知识面试题

本文摘要了Java相关的重要面试知识点:1. IO流分类(输入/输出流、字节/字符流);2. JSP四种作用域;3. BIO/NIO/AIO的区别及特点;4. 反射机制的概念与作用;5. Java序列化的定义及应用场景;6. 对象克隆的实现方式与深浅拷贝区别;7. 常见异常类型及处理方式(包括final/finally/finalize的差异)。同时还提及了文件操作常用方法和异常处理机制等核心内容,为Java开发者提供了系统性的面试复习要点。

2401_89221867的博客 973

Java异常核心概念深度剖析:从原理到实战

异常处理是程序设计中的一个重要部分,它允许程序在遇到错误时优雅地恢复或终止,而不是让程序崩溃。Java提供了一套完整的异常处理机制,本文详细解析了Java异常核心概念

清酒伴风的博客 1180

Java是如何实现异常处理的?

文章目录一、二、总结 一、 二、 总结

Netgrow的博客 305

Java中的异常

Java异常类处理

m0_61924520的博客 4630

【Java八股 | 基础篇】深拷贝与浅拷贝、注解、异常

根据上图我们可以看到异常Exception是Throwable的子类,Throwable的子类中除异常外还有错误Error。它们都属于异常体系。

miaowa_311的博客 1035

java面试基础知识点(2)

摘要 本文介绍了Java基础语法中的几个核心概念: 抽象类与接口:JDK8引入的default方法使接口支持向后兼容,允许添加新方法而不影响现有实现类。通过示例代码展示了接口的default方法、static方法的使用,以及多继承冲突的钻石问题解决方案。 异常体系:详细解析了Java异常分类(Error/Exception、Checked/Unchecked异常),并给出异常处理最佳实践,包括try-with-resources、日志记录和异常包装。重点分析了finally块执行的特殊情况。 泛型机制:阐述

2301_80294691的博客 379

关于Java异常处理机制的深入理解

1 引子  try…catch…finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很轻易理解。不过,我亲自体验的“教训”告诉我,这个东西可不是想象中的那么简单、听话。不信?那你看看下面的代码,“猜猜”它执行后的结果会是什么?不要往后看答案、也不许执行代码看真正答案哦。假如你的答案是正确,那么这篇文章你就不用浪费时间看啦。  public class TestExc...

survey321的博客 98

安卓/Java语言基础八股文

安卓/java面试题——java语言基础

凛_Lin~~的博客 2016

MIT 6.092 入门 Java 编程:七节课掌握编译原理、基础类型与调试——cs-self-learning 课程指南

本指南基于开源仓库 cs-self-learning(计算机自学指南)中 编程入门/Java 目录下的 MIT 6.092 课程页整理而成。该课程是 MIT 面向零基础学习者开设的 Java 入门课,也是本仓库编程入门体系中 Java 方向的唯一推荐课程,适合希望以最短时间建立 Java 语言基础并衔接软件工程进阶路线的自学者。读完本文,你将清楚这门课的难度定位、七节课的知识主线、学习节奏与配套资

gitblog_00652的博客 370

重修JAVA基础【二】

重修JAVA基础【二】

辣椒炒肉~的博客 203
上一篇: 事务是怎样工作的
三易的博客
博客等级 码龄15年 42粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值