丝甲坞 发表于 2025-6-9 15:00:14

Java中编译期异常和运行期异常的区别

在Java中,异常分为运行期异常(Runtime Exception)和编译期异常(Checked Exception),两者的核心区别在于 编译器是否强制要求处理。以下是它们的详细对比:
1. 定义与分类

类别运行期异常(Runtime Exception)编译期异常(Checked Exception)继承关系继承自 RuntimeException(属于Unchecked Exception)直接继承自 Exception(但不继承RuntimeException)处理要求不强制处理(编译器不检查)必须显式处理(捕获或抛出,否则编译报错)设计意图表示程序逻辑错误或不可控的运行时问题(如空指针、数组越界)表示可预见的、需要程序主动处理的异常(如文件不存在、网络中断)2. 常见示例

运行期异常编译期异常NullPointerExceptionIOExceptionArrayIndexOutOfBoundsExceptionSQLExceptionClassCastExceptionFileNotFoundExceptionArithmeticException(除零错误)InterruptedException3. 处理方式对比

(1) 运行期异常(Runtime Exception)


[*]无需强制处理,但建议在代码中主动避免或捕获。
[*]如果未处理,异常会向上传播,最终导致程序崩溃。
[*]典型场景:// 示例:可能抛出NullPointerException
String str = null;
System.out.println(str.length()); // 运行时抛出异常
(2) 编译期异常(Checked Exception)


[*]必须显式处理(否则编译失败)。
[*]两种处理方式:

[*]捕获异常(try-catch)
[*]声明抛出(throws)
// 示例:必须处理IOException(编译期检查)
public void readFile() throws IOException { // 方式1:声明抛出
    FileReader file = new FileReader("test.txt");
}

// 或
public void readFile() {
    try {
      FileReader file = new FileReader("test.txt");
    } catch (IOException e) { // 方式2:捕获处理
      e.printStackTrace();
    }
}
4. 核心区别总结

对比维度运行期异常编译期异常处理强制力不强制处理(程序员自行决定是否处理)必须处理(否则编译失败)错误类型程序逻辑错误或不可控的运行时问题外部依赖导致的、可预见的异常代码健壮性依赖程序员主动预防(如判空、校验参数)强制程序员处理潜在问题典型修复方式通过代码逻辑修复(如避免空指针、数组越界)通过异常处理或资源管理(如重试、关闭连接)5. 为什么这样设计?


[*]运行期异常:
通常由程序逻辑错误引起(如空指针、除零错误),属于开发者应主动避免的问题。编译器不强制处理,避免代码冗余。
[*]编译期异常:
表示程序依赖的外部环境可能发生的问题(如文件不存在、网络中断)。强制处理是为了让开发者明确应对这些可预见的异常,提升代码可靠性。
6. 实际开发中的建议


[*]运行期异常:

[*]通过代码逻辑避免(如判空、校验数组索引)。
[*]在关键位置捕获处理(如框架层统一处理)。

[*]编译期异常:

[*]优先明确处理(如重试文件读取)。
[*]如果无法处理,可向上抛出并记录日志。

[*]自定义异常:

[*]业务错误通常定义为RuntimeException(避免强制调用方处理)。
[*]需要调用方主动处理的异常定义为Checked Exception。

一句话总结


[*]运行期异常:程序员的锅,编译器不强制背锅。
[*]编译期异常: 调用方的锅,编译器要求必须背锅!-

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

姥恫 发表于 2025-11-21 15:24:19

过来提前占个楼

慷规扣 发表于 2025-12-11 12:27:29

新版吗?好像是停更了吧。

豺独 发表于 2025-12-20 10:49:53

感谢分享,下载保存了,貌似很强大

万妙音 发表于 2026-1-13 23:26:29

很好很强大我过来先占个楼 待编辑

驶桐柢 发表于 2026-1-14 10:59:06

懂技术并乐意极积无私分享的人越来越少。珍惜

訾懵 发表于 2026-1-17 14:42:06

喜欢鼓捣这些软件,现在用得少,谢谢分享!

强怀梅 发表于 2026-1-18 08:01:31

过来提前占个楼

龙梨丝 发表于 2026-1-20 10:26:17

谢谢分享,辛苦了

庾芷秋 发表于 2026-1-21 16:49:07

很好很强大我过来先占个楼 待编辑

采序 发表于 2026-1-25 10:46:46

鼓励转贴优秀软件安全工具和文档!

威割 发表于 2026-1-25 11:22:42

收藏一下   不知道什么时候能用到

尚腱埂 发表于 2026-1-25 17:56:54

这个好,看起来很实用

黎瑞芝 发表于 2026-1-25 22:00:27

谢谢分享,试用一下

狙兕 发表于 2026-1-27 07:18:04

热心回复!

旌磅箱 发表于 2026-2-2 02:27:10

分享、互助 让互联网精神温暖你我

遏筒煽 发表于 2026-2-3 19:43:52

东西不错很实用谢谢分享

陈兰芳 发表于 2026-2-4 00:53:28

不错,里面软件多更新就更好了

笙芝 发表于 2026-2-4 10:39:22

这个有用。

少屠 发表于 2026-2-7 23:57:24

谢谢分享,试用一下
页: [1] 2
查看完整版本: Java中编译期异常和运行期异常的区别