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编译期异常和运行期异常内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 简单介绍一下什么是microservice微服务

    简单介绍一下什么是microservice微服务

    这篇文章主要介绍了一下什么是microservice微服务微服务的定义,微服务到底是什么意思?什么样的架构可以叫做微服务?这篇文章可以给你答案
    2023-03-03
  • JVM完全解读之YGC来龙去脉分析

    JVM完全解读之YGC来龙去脉分析

    YGC是JVM GC当前最为频繁的一种GC,一个高并发的服务在运行期间,会进行大量的YGC,发生YGC时,会进行STW,一般时间都很短,除非碰到YGC时,存在大量的存活对象需要进行拷贝
    2022-01-01
  • mybatis 解决将数值0识别成空字符串的问题

    mybatis 解决将数值0识别成空字符串的问题

    这篇文章主要介绍了mybatis 解决将数值0识别成空字符串的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • 使用maven依赖详解

    使用maven依赖详解

    本文主要介绍了Maven的基础知识,包括Maven的简介、仓库类型、常用命令、场景举例、指令总结、依赖范围、settings.xml说明等,同时,还详细讲解了Maven依赖的传递、手动声明optional、冲突解决等概念
    2025-02-02
  • Java实现API sign签名校验的方法详解

    Java实现API sign签名校验的方法详解

    为了防止中间人攻击,有时我们需要进行API sign 签名校验。本文将用Java语言实现API sign 签名校验,感兴趣的小伙伴可以尝试一下
    2022-07-07
  • SpringBoot缓存预热实战

    SpringBoot缓存预热实战

    缓存预热是一种常见的优化策略,旨在提高系统的响应速度和性能,本文主要介绍了SpringBoot缓存预热实战指南,具有一定的参考价值,感兴趣的可以了解一下
    2025-01-01
  • SpringBoot+随机盐值+双重MD5实现加密登录

    SpringBoot+随机盐值+双重MD5实现加密登录

    数据加密在很多项目上都可以用到,大部分都会采用MD5进行加密,本文主要介绍了SpringBoot+随机盐值+双重MD5实现加密登录,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • 深入理解JVM垃圾回收算法

    深入理解JVM垃圾回收算法

    我们都知道java语言与C语言最大的区别就是内存自动回收,那么JVM是怎么控制内存回收的,这篇文章将介绍JVM垃圾回收的几种算法,从而了解内存回收的基本原理
    2021-06-06
  • Java中RocketMQ的延迟消息详解

    Java中RocketMQ的延迟消息详解

    这篇文章主要介绍了Java中RocketMQ的延迟消息详解,RocketMQ是一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠、万亿级容量、灵活可伸缩的消息发布与订阅服务,需要的朋友可以参考下
    2023-09-09
  • Java开发框架spring实现自定义缓存标签

    Java开发框架spring实现自定义缓存标签

    这篇文章主要介绍了Java开发框架spring实现自定义缓存标签的详细代码,感兴趣的小伙伴们可以参考一下
    2015-12-12

最新评论