Java中编译期异常和运行期异常的区别
在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. 实际开发中的建议
运行期异常:
- 通过代码逻辑避免(如判空、校验数组索引)。
- 在关键位置捕获处理(如框架层统一处理)。
编译期异常:
- 优先明确处理(如重试文件读取)。
- 如果无法处理,可向上抛出并记录日志。
自定义异常:
- 业务错误通常定义为
RuntimeException
(避免强制调用方处理)。 - 需要调用方主动处理的异常定义为
Checked Exception
。
- 业务错误通常定义为
一句话总结
- 运行期异常:程序员的锅,编译器不强制背锅。
- 编译期异常: 调用方的锅,编译器要求必须背锅!-
Java中编译期异常和运行期异常的区别的更多相关文章
- 深入分析Java的编译期与运行期
不知大家有没有思考过,当我们使用IDE写了一个Demo类,并执行main函数打印 hello world时都经历了哪些流程么? 想通过这篇文章来分析分析Java的执行流程,或者换句话说想聊聊Java的 ...
- java在编译期和运行期都做了什么
Java对象内存存储,引用传递,值传递详细图解 java对象在内存中的分配 编译过程: 编译器把一种语言规范转化为另一种语言规范的这个过程需要哪些步骤?回答这个问题需要参照<编译原理>,总 ...
- c++ 编译期与运行期
分享到 一键分享 QQ空间 新浪微博 百度云收藏 人人网 腾讯微博 百度相册 开心网 腾讯朋友 百度贴吧 豆瓣网 搜狐微博 百度新首页 QQ好友 和讯微博 更多... 百度分享 转自:http://h ...
- java中4种修饰符访问权限的区别及详解全过程
java中4种修饰符访问权限的区别及详解全过程 http://jingyan.baidu.com/article/fedf0737700b3335ac8977ca.html java中4中修饰符分别为 ...
- Java中集合List,Map和Set的区别
Java中集合List,Map和Set的区别 1.List和Set的父接口是Collection,而Map不是 2.List中的元素是有序的,可以重复的 3.Map是Key-Value映射关系,且Ke ...
- Java中的“==操作符”和equals方法有什么区别
Java中的"=="和equals方法究竟有什么区别? 1.==操作符 "=="操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的 ...
- java中,return和return null有什么区别吗?
java中,return和return null有什么区别吗? 最大的区别:return;方法的返回值必须是void!return null;方法的返回值必须不是 原始数据类型(封装类除过)和void ...
- Java中关键字continue、break和return的区别
Java中关键字continue.break和return的区别: continue:跳出本次循环继续下一次循环 break: 跳出循环体,继续执行循环外的函数体 return: 跳出整个函数 ...
- Java中Compareable和Comparator两种比较器的区别
Java中Compareable和Comparator两种比较器的区别 参考原文链接:https://www.cnblogs.com/ldy-blogs/p/8488138.html 1.引言 在ja ...
- java中的NIO和IO到底是什么区别?20个问题告诉你答案
摘要:NIO即New IO,这个库是在JDK1.4中才引入的.NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多. 本文分享自华为云社区<jav ...
随机推荐
- 使用 ASP.NET Core 5 Web API 创建可发现的 HTTP API
使用 ASP.NET Core 5 Web API 创建可发现的 HTTP API https://devblogs.microsoft.com/aspnet/creating-discoverabl ...
- 中电金信发布两款大模型产品,打通AI+应用“最后一公里”
近年来,以大模型为代表的人工智能技术已成为引领新一代产业变革的核心动力.2024年政府工作报告首次提出"人工智能+",要求"大力推进现代化产业体系建设,加快发展新质生产力 ...
- C#/.NET/.NET Core技术前沿周刊 | 第 18 期(2024年12.16-12.22)
前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...
- Qt音视频开发16-通用悬浮按钮工具栏的设计
一.前言 通用悬浮按钮工具栏这个功能经过了好几个版本的迭代,一开始设计的时候是写在视频控件widget窗体中,当时功能简单就放一排按钮在顶部悬浮widget中就好,随着用户需求的变化,用户需要自定义悬 ...
- Qt编写物联网管理平台47-通用数据库设置
一.前言 为了做这个通用的数据库组件,专门安装了虚拟机来安装各种版本的不同类型的数据库做测试,包括编译对应的数据库插件,我一直坚信的是一切从实际出发+有实际采用发言权,包括不同Qt版本编译mysql. ...
- Qt自定义控件大全文章导航
文章 链接 Qt编写自定义控件1-汽车仪表盘 https://qtchina.blog.csdn.net/article/details/89407746 Qt编写自定义控件2-进度条标尺 https ...
- springboot的Web项目编译运行时提示错误:Field userService in com.cetc.UserManger.controller.UserController required a bean of type 'com.cetc.UserManger.service.UserService' that could not be found.
错误描述: springboot的Web项目编译运行时提示错误:Field userService in com.cetc.UserManger.controller.UserController r ...
- 基于C#实现串口通信Demo
原文链接:基于C#实现串口通信Demo
- IM开发基础知识补课(十):大型IM系统有多难?万字长文,搞懂异地多活!
本文由公众号"水滴与银弹"号主Kaito原创分享,原题"搞懂异地多活,看这篇就够了",为使文章更好理解,有修订. 1.引言 前几天技术群里有群友问我手上有没有I ...
- 在Deepin系统上配置微软Windows远程桌面服务
. 前言 本文主要讲解如何在deepin系统上安装和配置Xrdp远程桌面. Xrdp是微软的远程桌面协议(Remote Desktop Protocol, RDP)的开源版本.在Linux系统上安装X ...