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


1. 定义与分类

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

2. 常见示例

运行期异常 编译期异常
NullPointerException IOException
ArrayIndexOutOfBoundsException SQLException
ClassCastException FileNotFoundException
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. 实际开发中的建议

  1. 运行期异常

    • 通过代码逻辑避免(如判空、校验数组索引)。
    • 在关键位置捕获处理(如框架层统一处理)。
  2. 编译期异常

    • 优先明确处理(如重试文件读取)。
    • 如果无法处理,可向上抛出并记录日志。
  3. 自定义异常

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

一句话总结

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

Java中编译期异常和运行期异常的区别的更多相关文章

  1. 深入分析Java的编译期与运行期

    不知大家有没有思考过,当我们使用IDE写了一个Demo类,并执行main函数打印 hello world时都经历了哪些流程么? 想通过这篇文章来分析分析Java的执行流程,或者换句话说想聊聊Java的 ...

  2. java在编译期和运行期都做了什么

    Java对象内存存储,引用传递,值传递详细图解 java对象在内存中的分配 编译过程: 编译器把一种语言规范转化为另一种语言规范的这个过程需要哪些步骤?回答这个问题需要参照<编译原理>,总 ...

  3. c++ 编译期与运行期

    分享到 一键分享 QQ空间 新浪微博 百度云收藏 人人网 腾讯微博 百度相册 开心网 腾讯朋友 百度贴吧 豆瓣网 搜狐微博 百度新首页 QQ好友 和讯微博 更多... 百度分享 转自:http://h ...

  4. java中4种修饰符访问权限的区别及详解全过程

    java中4种修饰符访问权限的区别及详解全过程 http://jingyan.baidu.com/article/fedf0737700b3335ac8977ca.html java中4中修饰符分别为 ...

  5. Java中集合List,Map和Set的区别

    Java中集合List,Map和Set的区别 1.List和Set的父接口是Collection,而Map不是 2.List中的元素是有序的,可以重复的 3.Map是Key-Value映射关系,且Ke ...

  6. Java中的“==操作符”和equals方法有什么区别

    Java中的"=="和equals方法究竟有什么区别? 1.==操作符 "=="操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的 ...

  7. java中,return和return null有什么区别吗?

    java中,return和return null有什么区别吗? 最大的区别:return;方法的返回值必须是void!return null;方法的返回值必须不是 原始数据类型(封装类除过)和void ...

  8. Java中关键字continue、break和return的区别

    Java中关键字continue.break和return的区别: continue:跳出本次循环继续下一次循环 break:   跳出循环体,继续执行循环外的函数体 return:   跳出整个函数 ...

  9. Java中Compareable和Comparator两种比较器的区别

    Java中Compareable和Comparator两种比较器的区别 参考原文链接:https://www.cnblogs.com/ldy-blogs/p/8488138.html 1.引言 在ja ...

  10. java中的NIO和IO到底是什么区别?20个问题告诉你答案

    摘要:NIO即New IO,这个库是在JDK1.4中才引入的.NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多. 本文分享自华为云社区<jav ...

随机推荐

  1. Linux内核内存保护机制:aslr和canary

    Linux内核内存保护机制:aslr和canary ASLR ASLR技术,全称为Address space layout randomization(地址空间布局随机化),是现代通用操作系统基本都会 ...

  2. Docker安装最新版MySQL

    下载docker dnf -y install docker 下载mysql镜像 docker pull mysql 运行Mysql mkdir -p /home/mysql/data docker ...

  3. 小程序 + node koa2 session存储验证码碰到最大的坑,(喜极而泣 /狗头)

    问题:session存验证码.本地拿postman测试了半天,都没有问题.   但到了小程序,服务端再获取(ctx.session.verifyCode)就一直提示不存在.undefined 小程序会 ...

  4. 部署docker-registry +ui , 使用ansible部署docker实例

    #部署docker-registry +ui , 使用ansible部署docker实例 docker registry 配置域名证书, 用户密码认证, 轻量UI shell部署docker-regi ...

  5. django内置序列化组件(drf前身)

    目录 一.django内置序列化组件(drf前身) 一.django内置序列化组件(drf前身) 一.django内置序列化组件(drf前身) 这里的内置序列化组件,其实就是实现将后端数据,存放到字典 ...

  6. 【软件】【逆向】StarUML regist

    // 安装npm brew install node //安装打包工具 npm install asar -g C:\Program Files\StarUML\resources StarUML\r ...

  7. 组件漏洞测试工具---Dependency-Check

    目录 文章综述 Dependency-Check简介 工作原理 常用命令 报告解读 使用场景 缺点 文章综述 本文主要介绍Dependency-Check工具的工作原理和使用方法,并提供一个开源方案帮 ...

  8. Qt编写可视化大屏电子看板系统32-模块10大屏地图

    一.前言 大屏地图模块采用浏览器模块+echart组件,Qt自带了webkit或者webengine模块,其中在win上mingw编译器的Qt5.6以后的版本,没有了浏览器模块,这个就需要用第三方的浏 ...

  9. Qt开源作品44-超级曲线图表

    按照国际惯例,先吹吹牛,QCustomPlot这个开源图表组件,作者绝对是全宇宙Qt领域的天花板,设计的极其巧妙和精美,各种情况都考虑到了,将每个功能细分到不同的类,每个类负责管理自己的绘制和各种属性 ...

  10. C# – XmlSerializer:字符串“2020-07-31 09:29:16”不是有效的 AllXsd 值。

    C#中使用XmlSerializer对字符串进行反序列化时,提示:字符串"2020-07-31 09:29:16"不是有效的AllXsd值. 原因: 先说下为什么会出现这样的错误, ...