java字节码分析--异常表


import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;

public class Test {

    public static void main(String[] args) {
        try {
            InputStream is = new FileInputStream("xx");
            ServerSocket serverSocket = new ServerSocket(8080);
            serverSocket.accept();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {

        }
    }
    /**
     *  0 new #2 <java/io/FileInputStream> 创建对象
     *  3 dup  复制栈顶的值,并且压入操作数栈
     *  4 ldc #3 <xx> 从常量池push推进去,以便构建FileInputStream对象
     *  6 invokespecial #4 <java/io/FileInputStream.<init>>  对用父类的构造方法
     *  9 astore_1  将引用(new FileInputStream()的存储地址)存放到局部变量1中
     * 10 new #5 <java/net/ServerSocket>  创建对象
     * 13 dup  复制栈顶的值,并且压入操作数栈
     * 14 sipush 8080  将short值推送栈顶
     * 17 invokespecial #6 <java/net/ServerSocket.<init>> 调用父类构造方法
     * 20 astore_2 将引用(new ServerSocket的存储地址)存放到局部变量1中
     * 21 aload_2  从局部变量表中加载引用放入栈顶
     * 22 invokevirtual #7 <java/net/ServerSocket.accept>
     * 25 pop  弹出操作数栈顶的值
     * 26 goto 40 (+14) 若正常没有出现异常那么执行40行代码若出现异常:
     * 29 astore_1 异常表0-25行出现异常后执行,先把异常对象的地址复制给局部变量3即e,
     * 30 aload_1  将异常对象从局部变量表中去除放入栈顶
     * 31 invokevirtual #9 <java/io/IOException.printStackTrace>
     * 34 goto 40 (+6)
     * 37 astore_3 异常表0-25行出现异常后执行,先把异常对象的地址复制给局部变量3即e,
     * 38 aload_3 将异常对象从局部变量表中去除放入栈顶
     * 39 athrow
     * 40 return
     */
}

2.java异常表

anv表示上面没法处理的异常交给它处理。

同时我们发现finally语句代码块是多份的,也就是说有几个异常就由几个finally。

3. 显示抛异常

    private String sayHello(String hello) throws InterruptedException, IOException {
        Thread.sleep(1000);
        ServerSocket socket  = new ServerSocket(80);
        return hello + "hello";
    }

我们发现在方法上抛异常和直接在方法内抛异常的处理方式是不一样的。这种方式比较简单。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值