jvm——字节码中的方法的执行分析

1、代码

package com.bytecode;

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

/**
 * @author dc
 * @date 2020/6/24 - 16:22
 */
public class MyTest3 {
    /**
     * 对于java类中的每一个实例方法(非static方法),其在编译后所生成的字节码当中,方法参数的数量多
     * 一个(this),它位于方法的第一个参数位置处;这样我们就可以在java的实例方法中使用this来访问当
     * 前对象的属性及其它方法。
     *
     *
     * 这个操作实在编译期间完成的,即由javac编译器在编译的时候将对this的访问转化为对一个普通实例方法
     * 参数的访问,接下来在运行期间,由jvm调用实例方法时,自动向实例方法传入该this参数。所以,在实例
     * 方法的局部变量表中,至少会有一个指向当前对象的局部变量。
     */

    /**
     * java字节码对于异常的处理方式:
     *
     * 1、统一采用异常表的方式来对异常进行处理。
     * 2、在jdk1.4.2之前的版本中,并不是使用异常表的方式来对异常进行处理的,而是采用特定的指令方式
     * 3、当异常处理存在finally语句块时,现代化的jvm采取的处理方式是将finally语句块的字节码拼接到每一个
     * catch语句块后面,换句话说,程序中存在多少个catch语句块,就会在每一个catch语句块后面重复多少个
     * finally语句块字节码。
     */

    public void test() throws FileNotFoundException, IOException{

        try {
            InputStream is = new FileInputStream("test.txt");

            ServerSocket serverSocket = new ServerSocket(9999);
            serverSocket.accept();
        }catch (FileNotFoundException ex) {
            System.out.println("抛出了FileNotFoundException异常");
        }catch (IOException ex) {
            System.out.println("抛出了IOExcption异常");
        }catch (Exception ex) {
            System.out.println("抛出了Exception异常");
        }finally {
            System.out.println("执行了finally代码块");
        }

    }
    /**
     * 在方法中对于异常的处理方式有两种:throws抛出、try——catch捕获异常
     * 这两种方式反映在字节码中是不同的,若采用捕获的方式,那么该方式体现在方法体中;
     * 若采用抛出的方式,那么这种方式抛出的异常会与方法体并列存在。
     */

}

2、截图

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值