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 关键区别
- C中断是异步的(随时可能发生,如硬件中断),Java异常是同步的(在特定代码处抛出)。
-
C中断可能直接导致程序崩溃(如
SIGSEGV
),Java异常通常可恢复(除非是Error
)。 - C需要手动管理中断(如防止竞态条件),Java异常由JVM自动处理。