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

 更新时间:2025年02月26日 09:33:31   作者:Tomorrowland_D  
Java中的异常分为运行期异常(RuntimeException)和编译期异常(CheckedException),前者不强制处理,后者必须显式处理,本文介绍Java中编译期异常和运行期异常的区别,感兴趣的朋友一起看看吧

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

1. 定义与分类

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

2. 常见示例

运行期异常编译期异常
NullPointerExceptionIOException
ArrayIndexOutOfBoundsExceptionSQLException
ClassCastExceptionFileNotFoundException
ArithmeticException(除零错误)InterruptedException

3. 处理方式对比

(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

一句话总结

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

到此这篇关于Java中编译期异常和运行期异常的区别的文章就介绍到这了,更多相关Java编译期异常和运行期异常内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 利用Spring IOC技术实现用户登录验证机制

    利用Spring IOC技术实现用户登录验证机制

    这篇文章主要为大家详细介绍了Spring IOC技术实现用户登录验证机制的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • java中JDBC实现往MySQL插入百万级数据的实例代码

    java中JDBC实现往MySQL插入百万级数据的实例代码

    这篇文章主要介绍了java中JDBC实现往MySQL插入百万级数据的实例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-01-01
  • 浅析Java Scanner 类的用法

    浅析Java Scanner 类的用法

    这篇文章主要介绍了Java Scanner 类的用法,文中讲解非常详细,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • Springboot使用java.ext.dirs方式的漏洞解析

    Springboot使用java.ext.dirs方式的漏洞解析

    文中给大家介绍了java.ext.dirs在Java9后被弃用,导致兼容性、安全性和管理问题,建议采用SpringBoot的自定义类加载器、模块化系统或容器化技术(如Docker)替代,以提升隔离性与可维护性,下文重点解析Springboot使用java.ext.dirs方式的缺陷,感兴趣的朋友一起看看吧
    2025-08-08
  • SpringBoot Shiro授权实现过程解析

    SpringBoot Shiro授权实现过程解析

    这篇文章主要介绍了SpringBoot Shiro授权实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • java实现简单的客户信息管理系统

    java实现简单的客户信息管理系统

    这篇文章主要为大家详细介绍了java实现简单的客户信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • Java异或技操作给任意的文件加密原理及使用详解

    Java异或技操作给任意的文件加密原理及使用详解

    这篇文章主要介绍了Java异或技操作给任意的文件加密原理及使用详解,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • Java 流处理之收集器详解

    Java 流处理之收集器详解

    这篇文章主要介绍了Java 流处理之收集器,本文以记录 Record 为例,结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • 如何使用java写Student类的功能

    如何使用java写Student类的功能

    这篇文章主要介绍了如何使用java写Student类的功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • Spring中@Async的使用小结

    Spring中@Async的使用小结

    在Java开发中,我们常常会遇到需要执行耗时操作的场景,例如文件上传、网络请求等,本文将介绍如何在Java中使用异步方法,并探讨其中的一些注意事项,感兴趣的朋友跟随小编一起看看吧
    2024-01-01

最新评论