在 Java 里,“异常会中断程序/线程执行”并不是因为 JVM 故意停止,而是异常的传播机制 + 没有捕获处理共同导致的结果。可以从下面几个层面理解。
Java 的异常本质是 Throwable 对象,它代表了“正常流程无法继续”的情况。
当异常被 抛出(throw) 后,JVM 会做一件事:
从当前代码位置,向上(调用栈)查找是否有 catch 能处理它
如果找到了 → 进入 catch
如果一直没找到 → 异常继续向上抛
void a() {
int x = 1 / 0; // 抛 ArithmeticException
System.out.println("不会执行");
}
异常发生后:
public static void main(String[] args) {
a();
System.out.println("main 结束");
}
static void a() {
b();
}
static void b() {
throw new RuntimeException("boom");
}
执行顺序:
b() 抛异常a() 没 catchmain() 没 catch✅ 所以你会看到:
异常是否中断,取决于 有没有被 catch:
try {
int x = 1 / 0;
} catch (ArithmeticException e) {
System.out.println("处理了异常");
}
System.out.println("继续执行");
输出:
处理了异常
继续执行
new Thread(() -> {
throw new RuntimeException("线程1挂了");
}).start();
// 主线程不受影响
| 场景 | 原因 |
|---|---|
| finally | 一定执行(除非 System.exit) |
| try-with-resources | 自动关闭资源 |
| 线程池 | 异常被吞掉或记录 |
✅ 防止错误被“悄悄忽略”
✅ 强制开发者关注异常路径
✅ 保证程序状态可控
如果不中断,可能会出现:
Java 异常“中断”,不是因为异常本身有破坏力,而是因为:异常在调用栈中一路上抛,直到没人处理,线程只能终止。
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。