Java 基础 - 异常机制详解

Java 基础 - 异常机制详解

Java 基础 - 异常机制详解 | Java 全栈知识体系

try和finally执行顺序

public class ExceptionDemo {
    private int x = 0;
    public static void main(String[] args) {
        System.out.println("test1结果" + new ExceptionDemo().test1());
        System.out.println("test2结果" + new ExceptionDemo().test2());
        System.out.println("test3结果" + new ExceptionDemo().test3());
    }

    // try块中的return语句执行成功后,并不马上返回,而是继续执行finally块中的语句。
    // 这是Java语言的强制性设计,为了保证资源清理的可靠性。
    // ++x操作会执行,再去执行finally
    public int test1() {
        try {
            System.out.println("test1 执行try");
            return ++x; // ++x操作会执行,再去执行finally
        } finally {
            System.out.println("test1 执行finally");
        }
    }

    // 不要在finally块中使用return。
    // 如果finally块中存在return语句,则在此直接返回,无情丢弃掉try块中的返回点。
    public int test2() {
        try {
            // x等于1,此处不返回
            return ++x;
        } finally {
            // 返回的结果是2
            return ++x;
        }
    }

    // Java使用了"返回值暂存"机制
    // 因为 return 的值在 try 块中已确定为 1,finally 块虽会执行并修改 i 为 2,但不会影响已决定的返回值。
    public int test3() {
        int i = 0;                    // 步骤1: i=0
        try {
            i = 1;                    // 步骤2: i=1
            return i;                 // 步骤3: 暂存返回值1,准备返回
        } finally {
            i = 2;                    // 步骤4: i=2,但返回值已固定为1
        }                             // 步骤5: 返回之前暂存的值1
    }
}

JVM处理异常的机制?

Java 基础 - 异常机制详解 | Java 全栈知识体系

异常发生的时候,当一个异常发生时

  • 1.JVM会在当前出现异常的方法中,查找异常表,是否有合适的处理者来处理
  • 2.如果当前方法异常表不为空,并且异常符合处理者的from和to节点,并且type也匹配,则JVM调用位于target的调用者来处理。
  • 3.如果上一条未找到合理的处理者,则继续查找异常表中的剩余条目
  • 4.如果当前方法的异常表无法处理,则向上查找(弹栈处理)刚刚调用该方法的调用处,并重复上面的操作。
  • 5.如果所有的栈帧被弹出,仍然没有处理,则抛给当前的Thread,Thread则会终止。
  • 6.如果当前Thread为最后一个非守护线程,且未处理异常,则会导致JVM终止运行。

以上就是JVM处理异常的一些机制。

posted @ 2025-12-08 15:13  deyang  阅读(17)  评论(0)    收藏  举报