java字节码分析--异常表

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014172271/article/details/83962484
1.根据代码,使用逐行翻译
package com.happylaishop.spring.util;

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";
    }

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

猜你喜欢

转载自blog.csdn.net/u014172271/article/details/83962484
今日推荐