深入理解try...catch(字节码层面)

这篇具有很好参考价值的文章主要介绍了深入理解try...catch(字节码层面)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

我们工作中常用try...catch来解决程序中出现的异常情况,但是你真的了解它的实现原理吗?今天我就带着大家从字节码层面理解try...catch

一、准备工作

我们首先需要准备好异常类和对应的测试类方便我们观察。

异常类:

public class DivideByZeroException extends Exception {
}

测试类:

public class ExceptionUtil {


    static int remainder(int dividend, int divisor) throws DivideByZeroException {
        try {
            return dividend % divisor;
        } catch (ArithmeticException var3) {
            throw new DivideByZeroException();
        }
    }
}

在idea中编译后,使用jclasslib插件即可查看对应的字节码,字节码如下。

 0 iload_0
 1 iload_1
 2 irem
 3 ireturn
 4 astore_2
 5 new #3 <com/haiwang/hotel/exception/DivideByZeroException>
 8 dup
 9 invokespecial #4 <com/haiwang/hotel/exception/DivideByZeroException.<init> : ()V>
12 athrow

右键点击可以查看字节码的详情。 

深入理解try...catch(字节码层面)

 深入理解try...catch(字节码层面)

该字节码可以分为两部分,一部分是对方法的常规处理,另一部分是对异常的处理

常规处理:

 0 iload_0//载入参数一
 1 iload_1//载入参数二
 2 irem//进行取余操作
 3 ireturn//返回操作值

异常处理:

 4 astore_2//将ArithmeticException的地址压栈
 5 new #3 <com/haiwang/hotel/exception/DivideByZeroException>//实例化DivideByZeroException
 8 dup//复制异常对象并放入栈顶

 9 invokespecial #4 <com/haiwang/hotel/exception/DivideByZeroException.<init> : ()V>//初始化DivideByZeroException

12 athrow//抛出异常的引用

在我们使用try...catch的时候都会生成一个异常表,jvm会查询这个异常表,并抛出对应的异常类。

深入理解try...catch(字节码层面)

参考文章:

How the Java virtual machine handles exceptions | InfoWorld

Java SE Specifications文章来源地址https://www.toymoban.com/news/detail-434114.html

到了这里,关于深入理解try...catch(字节码层面)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • try catch执行过程分析

    本篇文章带大家聊聊try catch的执行过程,有时候在开发的过程中,try代码里如果出现异常,catch后的步骤还会继续执行吗?以及finally的使用。 下面来分析一下几种使用场景: 场景一: try代码块中出现异常后,系统会继续执行catch代码块的程序。catch代码块外的代码也会继续被

    2024年02月15日
    浏览(41)
  • Java try catch语句详解

    在实际应用中,对于错误的处理是极其重要的,任何程序都很难做到百分百完美,程序中可能存在大量未知问题,所以程序开发时一定要对各种问题进行相应的处理,而 Java 提供的异常处理机制可以帮用户更好地解决这方面的问题。 Java 的异常处理机制可以让程序具有极好的

    2024年02月08日
    浏览(40)
  • 记录--try...catch知识补全

    说到 try...catch 都觉得非常熟悉了,不就是用来捕捉代码块中的错误嘛,平时也用得比较多的。然而因为了解不够多,我的面试却栽在了一个简单的知识点上: try...catch 只能捕捉到同步执行代码块中的错误 。 题目是:以下代码有错吗?如果有错,应该如何改正? 反正就是不

    2024年02月04日
    浏览(43)
  • 深入理解 python 虚拟机:字节码教程(3)——深入剖析循环实现原理

    在本篇文章当中主要给大家介绍 cpython 当中跟循环相关的字节码,这部分字节码相比起其他字节码来说相对复杂一点,通过分析这部分字节码我们对程序的执行过程将会有更加深刻的理解。 我们使用各种例子来理解和循环相关的字节码: 上面的代码对应的字节码如下所示:

    2023年04月15日
    浏览(38)
  • C#中try-catch语句

            在C#中,try-catch语句是一种异常处理机制,用于捕捉代码中发生的异常并作出相应的处理,防止程序因异常而崩溃。 try块中包含可能会出现异常的语句或代码块。当try块中的语句或代码块执行过程中发生异常时,程序会立即跳转到catch块,并执行catch块中的语句。

    2024年02月14日
    浏览(41)
  • try-catch以及使用技巧

    try-catch 是 JavaScript 处理错误的一种重要机制。try 块用来包含可能会出错的代码,catch 块用来处理 try 块中的错误。使用 try-catch 的主要目的是在代码出错时不会导致整个程序崩溃,可以让错误被妥善处理。 如果你想捕获代码中所有可能的异常,可以使用一个不带参数的 catch 代码

    2024年02月22日
    浏览(43)
  • kotlin协程异常处理之-try catch

    kotlin协程小记 协程的async使用 kotlin协程异常处理之-try catch kotlin协程异常处理之-CoroutineExceptionHandler try catch是否一定有效呢?未必,来看一下: withContext是一个挂起函数,它会暂停当前协程的执行,等待传递进来的协程上下文切换后继续执行。当在withContext内部发生异常时,

    2024年02月12日
    浏览(35)
  • 不要在代码中随便使用try...catch了

    前言  📫 大家好,我是南木元元,热爱技术和分享,欢迎大家交流,一起学习进步!  🍅  个人主页: 南木元元 目录 背景 js中的try...catch try...catch运行机制 js的事件循环机制 try...catch无法捕获异步错误的原因 解决方法 结语 之前面某物的时候,遇到了一个有关try...catch的问

    2024年03月14日
    浏览(64)
  • 如何优雅的写个try catch的方式!

    丑陋的 try catch 代码块 优雅的 Controller 上面的示例,还只是在 Controller 层,如果是在 Service 层,可能会有更多的 try catch 代码块。这将会严重影响代码的可读性、“美观性”。 所以如果是我的话,我肯定偏向于第二种,我可以把更多的精力放在业务代码的开发,同时代码也会

    2024年02月01日
    浏览(39)
  • 《深入理解Java虚拟机》读书笔记:字节码指令简介

    字节码指令简介   Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands)而构成。由于Java虚拟机采用面向操作数栈而不是寄存器的架构(这两种架构的区别和影响将在

    2024年02月12日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包