Java 面试题 异常return

本文深入探讨了Java中异常处理的流程,通过具体示例解释了try-catch-finally语句块的执行机制,并介绍了如何使用javap命令解析字节码,揭示了程序在JVM上的执行细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public static void main(String[] args) {
    int result=m1();
    System.out.println(result);
}
public static int m1(){
    int a=10;
    try{
        a=20;
        throw new RuntimeException();
    }catch(Exception e){
        a=30;
        return a;
    }finally {
        a=40;
    }
}
//答案
30

根据cmd 指令,打开字节码文件
javap -v 类名 > 保存的文件名
在这里插入图片描述
这个就是执行的流程。

首先我先讲讲内存空间的分布。主要分为:JVM栈,堆,MataSpace(源空间)。JVM栈分成诺干个栈帧,每一个栈帧对应着一个方法。源空间里有方法区,方法区里又有运行时常量池,运行时常量池中又有字符串常量池。

在这里插入图片描述

首先执行main()方法,main()入栈,之后调用m1()方法,m1()方法进栈。
在这里插入图片描述

执行m1(),而栈帧又是这样一种结构。里面有程序计数器,局部变量表,操作数栈。
在这里插入图片描述

左端是字节码文件。stack是指的操作数栈,只需要两个,locals指的是局部变量表。