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 ...
随机推荐
- Epicor 10 SaaS云登录
随着云计算的普及,几乎所有的软件都可以云化了,但事实上,并没有.尤其是在管理软件领域起步较早的 ERP 似乎在云化的道路上一直步履蹒跚. 随着公共云的成熟,人们的观念已经改变.云计算和 SaaS 提供 ...
- C#委托的前世今生
一.前言 大家好!我是付工. 十年前,刚开始学C#编程的时候,被委托困扰了很久. 今天跟大家分享一下关于委托的那些事儿. 二.委托原理 什么是委托? 抛开编程,委托是一个汉语词语,指的是把事情托付给别 ...
- 在 Ubuntu GUI 中以 root 身份登录
参考:https://zhuanlan.zhihu.com/p/610049537?utm_id=0 有一些桌面用户想以 root 身份登录.这不是什么明智之举,但肯定是可以做到的. 默认情况下,Ub ...
- okhttp3设置代理(http/https)
最近项目网络请求需要设置代理,记录一下.http和https都可以. OkHttpClient.Builder builder = new OkHttpClient.Builder(); //代理服务 ...
- Qt/C++原创推流工具/支持多种流媒体服务/ZLMediaKit/srs/mediamtx等
一.前言 1.1 功能特点 支持各种本地视频文件和网络视频文件. 支持各种网络视频流,网络摄像头,协议包括rtsp.rtmp.http. 支持将本地摄像头设备推流,可指定分辨率和帧率等. 支持将本地桌 ...
- sql建表添加注释的语句
官方自带的,我觉得麻烦,稍微'封装'一下 create proc Proc_AddExplian @table varchar(200), @clolum varchar(200), @text va ...
- [转]CFLAGS、CXXFLAGS、FFLAGS、FCFLAGS、LDFLAGS、LD_LIBRARY_PATH区别
CFLAGS.CXXFLAGS.FFLAGS.FCFLAGS.LDFLAGS.LD_LIBRARY_PATH区别 Linux笔记之LD_LIBRARY_PATH详解 翻译 搜索 复制
- [转]CMake学习笔记(一)基本概念介绍、入门教程及CLion安装配置
原文链接:CMake学习笔记(一)基本概念介绍.入门教程及CLion安装配置
- 【原创】浅谈EtherCAT主站EOE(下)-EtherCAT IgH主站EoE具体实现
目录 1.IgH 框架概述 2. IgH EOE机制 2.1 EoE服务规范 2.1 EoE虚拟网络设备 2.1.1 EoE Virtual Network Interfaces 2.1.2 EoE ...
- Python绘制土地利用和土地覆盖类型图详解
土地利用和土地覆盖是环境科学和城市规划中的重要概念,它们能够帮助本文理解人与自然的关系,促进可持续发展.随着城市化进程的加快,科学地监测和管理土地资源显得尤为重要.Python作为一种强大的编程语言, ...