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

文章通过一个简单的Java代码示例,展示了try...catch在字节码层面上的实现。在字节码中,异常处理分为常规处理和异常处理部分,JVM会查询异常表来处理异常。当发生异常时,JVM会实例化并抛出指定的异常类。
摘要由CSDN通过智能技术生成

我们工作中常用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

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

 

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

常规处理:

 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会查询这个异常表,并抛出对应的异常类。

参考文章:

How the Java virtual machine handles exceptions | InfoWorld

Java SE Specifications

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小海海不怕困难

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值