新闻详情

新闻详情

首页 / 资讯中心 / 详情

Java异常体系深度解析:从Throwable到自定义异常实战

发布时间:2026/10/2 16:26:25来源:尧图网络
Java异常体系深度解析:从Throwable到自定义异常实战
1. 异常体系的地基从Throwable开始梳理很多人把Java异常学成了背面试题知道有checked异常和unchecked异常知道try-catch能捕获异常但一旦遇到实际项目里的诡异报错立刻抓瞎。原因很简单——你只记住了树的叶子没记住树根。本文这一讲就是把异常类这棵树的根和主干讲透然后再带你看看实际写代码时那些最容易踩的坑。1.1 Throwable、Error、Exception三者的真实关系Java里所有异常相关的类最终都追溯到一个类java.lang.Throwable。这个类本身实现了Serializable接口意味着异常对象是可以被序列化的——这在跨进程传递异常信息时很有用但平时我们基本意识不到这一点。Throwable下面直接分出两个分支Error和Exception。Error代表JVM层面发生的严重问题比如OutOfMemoryError内存耗尽、StackOverflowError栈溢出、NoClassDefFoundError类定义找不到。这类问题的典型特征是程序本身无法处理也不应该尝试去捕获处理。你想内存都耗尽了你catch住这个Error又能怎么样呢连创建新对象都做不到了强行catch反而可能引发二次故障。Exception代表程序运行期间可以恢复、可以处理的问题。比如文件找不到、网络超时、参数格式错误。这里又分成两类后面专门讲。这里有个很重要的认知捕获异常不等于吞掉故障。很多程序员看到Exception就习惯性加个try-catch这是一种条件反射式的防御但往往是无效防御。真正专业的做法是先判断这个异常我catch了有没有意义。如果是Error分支除非确实需要特殊场景比如某些服务器框架需要在OOM前做资源清理否则一律不做捕获处理。1.2 异常信息的传递链条从哪来回哪去初学者经常搞不懂异常到底是怎么冒出来的。看一段最简单的代码public class Demo { public static void main(String[] args) { int result divide(10, 0); System.out.println(result); } public static int divide(int a, int b) { return a / b; } }运行后控制台会打印一个堆栈轨迹Stack Trace第一行通常是Exception in thread main java.lang.ArithmeticException: / by zero然后是at开头的调用栈信息。这个堆栈轨迹就是异常信息传递的具体体现divide方法里的算术运算触发了ArithmeticException当前方法没有捕获它异常对象就沿着调用栈向上抛先到main方法main也没捕获最终到达JVMJVM把异常信息连同完整的调用栈打印到控制台然后终止当前线程。理解这个传递机制对后面理解什么时候该捕获、什么时候该抛出非常关键。异常的本质是控制流的转移当异常发生时当前代码块的正常执行顺序被打断转而寻找匹配的catch处理器。找不到就一直往上走直到某处能处理或者直接暴露给JVM。2. checked异常与unchecked异常编译器凭什么多管闲事这是Java异常体系设计上最核心的划分也是面试里反复问的东西。不过面试题只会问区别是什么实际开发中真正的难点是哪些场景必须声明throws哪些不用以及背后的设计哲学是什么。2.1 RuntimeException及其子类程序员自己的逻辑问题RuntimeException运行时异常及其所有子类统称为unchecked异常。编译器不会强制你捕获或者声明抛出。常见的就有NullPointerException空指针、ArrayIndexOutOfBoundsException数组越界、ClassCastException类型转换错误、ArithmeticException算术异常、IllegalArgumentException非法参数、IndexOutOfBoundsException下标越界等等。这一类异常的特征是它们是可以通过代码逻辑检查提前规避的。比如数组越界你在访问数组前先判断一下index 0 index array.length就能完全避免。比如空指针先判断对象是否为null再调用方法就不会触发。所以Java设计者把这类异常定位为程序员写代码时的逻辑错误既然是逻辑错误就不该让编译器每个方法都强制声明否则代码里会满屏都是throws NullPointerException毫无意义。靠编译器的强制约束解决不了逻辑缺陷——这是关键设计思想。2.2 受检异常checked exception来自外部环境的合理风险和RuntimeException相对的是直接继承Exception类但不继承RuntimeException的那一大票异常比如IOException、SQLException、FileNotFoundException、ClassNotFoundException等。它们被称为checked异常受检异常。编译器强制要求如果某段代码可能抛出这类异常那么要么用try-catch把它捕获处理掉要么在方法声明处加上throws把它抛给调用方。两者必须选一个否则编译不通过。为什么要这么强势因为这类异常通常代表外部环境不可控因素导致的错误文件可能不存在、网络可能断开、数据库可能连不上。这些都不是你改改代码逻辑就能100%规避的。设计者的意图是通过编译器强制让你在编译期就意识到这段操作可能失败并逼迫你在代码里显式处理这种失败路径。举个实际例子public static void readConfig() throws IOException { FileInputStream fis new FileInputStream(config.properties); // ... }这里FileInputStream构造函数会抛出FileNotFoundExceptionIOException的子类所以要么在方法上声明throws IOException要么try-catch。不处理编译直接报错。2.3 区别背后的实际意义代码风格的分水岭理论上讲得很清楚了但实际开发中的较真点在哪里第一分层架构中的异常传播。在Service层调用DAO层时DAO层抛出的SQLException是checked异常Service层通常不该直接向上抛一个底层异常给Controller层因为Controller层的调用者根本不关心数据库连接池满了还是SQL写错了。主流做法是包装成自定义的业务异常unchecked类型在Service层把底层异常翻译成上层的语义化异常。这种做法后面讲自定义异常时细说。第二框架对两种异常的处理方式完全不一样。以Spring为例Transactional事务方法内部抛出checked异常时默认事务不会回滚认
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

TongWeb SSL协议下拉框空白:NoSuchAlgorithmException根源与JCA Provider排查修复 2026/10/2 19:00:55

TongWeb SSL协议下拉框空白:NoSuchAlgorithmException根源与JCA Provider排查修复

前两天同事lqw在群里丢了个截图过来:TongWeb 7049 M4管理控制台,SSL配置页面的“SSL协议”下拉框完全空白,后台日志里反复出现 java.security.NoSuchAlgorithmException 。截图下面附了一句话:“控制台打不开协议列表&#xff0…

阅读更多 →
Java校园商城多端源码拆解:订单、库存与支付回调核心设计 2026/10/2 19:00:48

Java校园商城多端源码拆解:订单、库存与支付回调核心设计

说实话,我第一次拿到“Java校园通:购物商城多端源码”这套项目时,第一反应是“又一个电商Demo”,但真正过完一遍代码后,发现它跟网上那些只教CRUD的单体商城完全不是一回事。它把一个现实里的校园商圈场景完整落地了&a…

阅读更多 →
综合能源系统优化调度:需求响应与阶梯碳交易建模详解 2026/10/2 19:00:42

综合能源系统优化调度:需求响应与阶梯碳交易建模详解

1. 项目到底在算什么:综合能源系统调度模型的设计思路1.1 电-热-气三网怎么耦合先把这个项目从“标题翻译成人话”:考虑综合需求响应和阶梯型碳交易机制的综合能源系统优化调度,核心是在 MATLAB 里搭建一个电、热、气多能互补的园区级能源系统…

阅读更多 →
端侧大模型落地指南:从实时全模态交互到自主智能体 2026/10/2 19:00:42

端侧大模型落地指南:从实时全模态交互到自主智能体

这两年但凡聊到大模型,话题重心已经从“模型多大参数”悄悄滑向“模型到底跑在哪”。动辄千亿参数的云端大模型固然能打,但真正让设备变得“懂你”的,反而是那些压到几个GB以内、能在手机和终端上本地运行的端侧大模型。CNCC2026 这场由清华刘…

阅读更多 →
端侧大模型落地指南:从实时全模态交互到自主智能体的关键技术与工程实践 2026/10/2 19:00:42

端侧大模型落地指南:从实时全模态交互到自主智能体的关键技术与工程实践

1. 端侧智能的现状与困局:为什么“跑得动”不等于“用得好”做端侧大模型这行的朋友,多少都有过类似的体验:模型在服务器上跑得好好的,评测指标也不差,一搬到手机或者嵌入式设备上,不是内存爆掉就是延迟高到…

阅读更多 →
Mamba并行扫描与硬件感知优化:让SSM在GPU上跑得更快 2026/10/2 19:00:41

Mamba并行扫描与硬件感知优化:让SSM在GPU上跑得更快

2. 核心细节解析与实操要点Mamba(下):并行扫描与硬件感知优化深度拆解搞大模型的朋友应该都发现了,2024年开源社区被Mamba刷屏的频率有多高。如果说上一篇文章我们把Mamba的架构和选择性机制讲清楚了,那这篇要聊的&…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉