OutOfMemoryError发生时finally通常能执行,但若其内部触发新内存分配或JVM已崩溃则可能失败;未捕获时后续代码不执行;System.exit()等强制终止方式可确定绕过finally。

会执行,但存在风险。
OutOfMemoryError属于Error,不是Exception
它继承自java.lang.VirtualMachineError,是JVM层面的严重问题。虽然不能被普通catch(Exception e)捕获,但可以用catch(Error e)或catch(Throwable t)捕获。
关键点在于:只要JVM尚未崩溃、线程未被强制终止,finally块仍会按约定执行。
finally通常能运行,但可能中途失败
即使发生OutOfMemoryError,JVM仍会尝试执行finally中的代码——前提是该代码本身不触发新的内存分配。
立即学习“Java免费学习笔记(深入)”;
- 如果
finally里只是简单打印日志、关闭已打开的文件句柄(不新建对象),大概率能成功执行 - 若
finally中调用了new String()、list.add()等需要堆内存的操作,可能再次抛出OutOfMemoryError,导致清理逻辑中断 - 极端情况下,JVM已处于极不稳定状态,
finally执行到一半就崩溃,后续代码(包括finally剩余部分)不再运行
try/catch块之后的代码不会执行
一旦OutOfMemoryError在try或catch中发生且未被捕获,异常会向上抛出,try-catch-finally结构之后的语句将跳过。
例如:
void test() {
try {
byte[] data = new byte[Integer.MAX_VALUE]; // 极大概率OOM
} catch (OutOfMemoryError e) {
System.out.println("caught OOM");
} finally {
System.out.println("in finally"); // ✅ 通常能输出
}
System.out.println("after try-catch-finally"); // ❌ 这行几乎不会执行
}
System.exit()和线程中断是更确定的“绕过”方式
相比OutOfMemoryError的不确定性,真正能稳定阻止finally执行的是:
-
System.exit(0):直接终止JVM,finally不执行 - 线程被
Thread.stop()(已废弃)或外部强制杀死 - JVM进程被操作系统kill
这些情况与OutOfMemoryError不同——它们是明确的、不可恢复的退出信号。


















