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 ...
随机推荐
- uView的DatetimePicker组件在confirm回调中取不到v-model的最新值
前情 uni-app是我比较喜欢的跨平台框架,它能开发小程序/H5/APP(安卓/iOS),重要的是对前端开发友好,自带的IDE让开发体验非常棒,公司项目就是主推uni-app,在uniapp生态中u ...
- electron项目icon显示异常
前情 公司有个桌面端项目是基于Electron开发的. 坑 构建打包好的项目在桌面和任务栏上图标显示正常,但是在任务栏弹框上左上角的图标确不显示 Why? 经过反复搜索,网上有文章说如果ico图标过大 ...
- Acrobat Pro DC 2024.005 像word一样编辑PDF
随着数字化的推广,PDF文件凭借其强大的优势和稳定性逐渐成为各类文档交流和存储的首选格式.随之而来的是对PDF文件的阅读.编辑.转换.转曲等各种操作需求的不断增长.因此,一款强大的PDF处理软件不仅需 ...
- 鸿蒙UI布局实战 —— 个人中心页面开发
1.前言 接下里我们将开启"鸿蒙UI布局系列"的学习,第一站:学习线性布局(Row/Column)+ 弹性布局(Flex) 在展开学习前,先上一个实战demo--开发一个个人中心页 ...
- 一款渗透测试信息收集集成工具--mitan密探
本工具仅供安全测试人员运用于授权测试, 禁止用于未授权测试, 违者责任自负.作者及本公众号相关负责人不对您使用该工具所产生的任何后果负任何法律责任,在扫描模块使用多线程,在测试过程中根据目标的实际情况 ...
- openEuler欧拉配置Nacos集群
一.安装Nacos systemctl stop firewalld systemctl disable firewalld mkdir -p /home/nacos tar xvf nacos- ...
- CentOS8 Failed to start docker.service: Unit docker.service not found处理方式
出现该问题的原因是 centos8 中的podman导致的,podman是centos8预装的类似docker的软件 不需要所以直接卸载. 解决方式: dnf remove podman 然后重装D ...
- C# 7.0 新特性:模式匹配 ( pattern matching)
C# 7.0 新特性:模式匹配 ( pattern matching ) 在 C# 中,is 是一个关键字,可以用来检查某个数据的类型是否为特定类型.这是一个表达式,返回类型为 boolean. 例如 ...
- 中电金信:“人工智能+”首次写入政府工作报告,各大企业何以破局AI模型挑战
2024年全球新一轮技术变革加速来临,大模型作为人工智能发展的核心引擎,正引发一场全新的工业革命.今年全国两会期间,人工智能成为最热话题之一."人工智能+"首次被写入政府工作报告 ...
- [转]CUDA,NVIDIA Driver,Linux,GCC之间的版本对应关系表格
在安装CUDA时一定要注意其与英伟达显卡驱动以及Linux系统和GCC版本的对应关系,如果版本之间不匹配,是安装不成功的. 一.CUDA与Driver的对应版本 参考链接:https://docs.n ...