C语言的中断 vs Java/Kotlin的异常:底层机制与高级抽象的对比-1. C语言的中断 vs Java/Kotlin的异常

时间:2025-05-14 12:56:32

1.1 触发机制不同

特性 C语言中断 Java/Kotlin异常
触发源 硬件(如键盘、定时器)或操作系统(如 SIGSEGV 程序逻辑错误(如 NullPointerException
层级 CPU/操作系统级别 JVM字节码级别
处理方式 中断服务例程(ISR)或信号处理函数 try-catch-finally
能否屏蔽 可屏蔽(如 cli/sti 指令) 不可屏蔽
性能影响 微秒级响应 毫秒级(涉及栈展开)

示例对比:

// C语言信号(软件中断)
#include <signal.h>
void handle_sigint(int sig) {
    printf("Received SIGINT (Ctrl+C)\n");
}
signal(SIGINT, handle_sigint); // 注册信号处理
// Kotlin异常(语言层面)
try {
    val x: String? = null
    println(x!!.length) // 触发 NullPointerException
} catch (e: Exception) {
    println("Caught: $e")
}

1.2 关键区别

  1. C中断是异步的(随时可能发生,如硬件中断),Java异常是同步的(在特定代码处抛出)。
  2. C中断可能直接导致程序崩溃(如 SIGSEGV),Java异常通常可恢复(除非是 Error)。
  3. C需要手动管理中断(如防止竞态条件),Java异常由JVM自动处理