当前位置: 首页 > news >正文

第十四章 异常

一、异常基础认知

1. 异常定义:程序正常运行流程中发生的非正常错误状况,会打乱原有代码执行逻辑。

2. 异常处理:提前编写对应备用代码,当异常触发时自动执行备用逻辑,避免程序直接崩溃。

3. 处理异常的实际价值:降低程序故障带来的数据、业务损失;向用户输出友好提示文字;方便开发人员定位、调试程序问题。

二、异常整体层级划分(面试核心考点)

1. 顶层父类:Throwable

Java中所有错误、异常的统一根类,归属java.lang核心包,内置两个调试工具方法:

• String getMessage():获取简短异常描述文本,多用于前端、用户提示展示

• void printStackTrace():打印完整方法调用栈信息,包含异常类型、出错代码行、调用链路,是开发调试最常用方法

2. 分支一:Error 系统级错误

Throwable的直接子类,代表程序完全无法自行修复的严重底层故障,开发者无需编写代码处理。
常见场景:JVM内存耗尽、递归深度超限栈内存溢出StackOverflowError、类加载失败等,出现后程序直接强制终止。

3. 分支二:Exception 业务可处理异常

程序运行中可以通过代码捕获、规避的故障,分为两大分支:

(1)RuntimeException 运行时异常(未检查异常)

所有直接/间接继承该类的异常统称运行时异常:

• 编译阶段编译器不会强制校验、强制处理,代码写完即可编译通过;仅在程序运行时报错。

• 处理方案:既可以捕获处理,也可以放任不处理,规范编码习惯能提前规避绝大多数运行时异常。

• 高频常见类型:
① NullPointerException 空指针异常:访问未初始化对象的属性/方法
② ArrayIndexOutOfBoundsException 数组下标越界:访问超出数组长度的索引
③ ClassCastException 强制类型转换异常:父子类无继承关系强转
④ NumberFormatException 数字格式异常:非数字字符串转数值类型

(2)非RuntimeException 编译期异常(已检查异常)

和RuntimeException无继承关系的Exception子类:

• 编译阶段编译器强制校验,不编写处理代码则直接编译报错,无法运行。

• 处理要求:代码中必须通过throws声明或者try-catch捕获处理。

• 典型示例:反射加载类Class.forName("类路径")、IO文件读写异常等。

三、异常的两种产生方式

1. 系统自动抛出异常

• 触发条件:执行存在逻辑漏洞、非法操作的代码时,JVM自动识别并生成异常对象抛出。

• 执行结果:若无任何异常处理代码,程序会立刻终止,异常后方所有代码不再执行。

2. 手动主动抛出异常(开发高频用法)

业务逻辑校验不通过时,开发者主动抛出异常中断流程,关键字throw

1. 固定语法:throw new 异常类("自定义异常提示文字");

2. 书写位置:仅允许写在方法内部代码块中

3. 执行效果:等同于return语句,立刻终止当前方法剩余代码,异常向上传递

四、异常的传递机制

Java异常遵循方法调用链反向传递规则:内层方法抛出异常后,若自身没有捕获处理,异常会逐层向上抛给调用它的上层方法,最终传递至JVM虚拟机,虚拟机收到未处理异常后直接终止整个程序。

五、两类异常处理方案(开发重点)

方案1:消极处理——throws 声明抛出异常

将异常处理责任转移给上层调用者,属于推卸式处理,关键字throws

1. 书写位置:方法声明末尾,参数列表之后

2. 完整语法:修饰符 返回值 方法名(参数列表) throws 异常1,异常2{}

3. 执行特点:仅做异常声明,不会拦截终止异常,异常依旧会向上传递,最终仍会导致程序崩溃

4. 实用作用:原本编译报错的受检异常,通过throws声明后可以正常编译运行

5. 多异常处理技巧:可以直接声明父类异常,利用多态统一处理该父类下全部子类异常

方案2:积极处理——try-catch 捕获拦截异常

直接在当前代码块拦截异常,异常被捕获后程序不会终止,后续代码正常执行

1. 基础语法模板
try{
// 存放有概率触发异常的业务代码
}catch(异常类型 异常对象){
// 对应异常触发时执行的补救、提示代码
}
2. catch多分支匹配规则

• 一个try块后方可以跟随多个catch块;异常触发时自上而下匹配,匹配到第一个对应异常分支即执行,后续catch不再校验。

• 多catch书写顺序:子类异常捕获分支必须写在父类异常分支上方,否则编译报错。

• 多态特性:catch中声明父类异常,可以捕获该类全部子类异常;运行时异常无论代码是否存在对应风险,catch都能捕获。

拓展:finally 最终执行代码块

1. 语法结构:拼接在全部catch分支之后
try{
// 风险代码
}catch(异常类 e){
// 异常处理逻辑
}finally{
// 无论try是否出现异常、catch是否执行,本段代码一定会运行
}
2. 开发使用场景:资源释放核心场景,如关闭文件流、数据库连接、网络连接等。

3. 编码规范:不建议在finally中书写return返回语句,会覆盖try、catch内的返回结果。

4. 合法组合结构:
try-catch、try-catch-catch、try-catch-finally、try-finally、嵌套try-catch结构
补充规则:一个try只能搭配一个finally,但可以搭配任意多个catch;try后必须至少存在一个catch或一个finally,语法才算完整。

六、自定义业务异常

Java自带异常无法贴合业务场景时,自行编写异常类区分业务故障,分为两类:

1. 编译型自定义异常:自定义类直接继承Exception,抛出后属于受检异常,编译强制处理。

2. 运行型自定义异常:自定义类继承RuntimeException,抛出后属于运行时异常,编译无强制校验。

3. 规范构造方法(必须提供两个构造器)

• 无参构造方法:基础空参构造

• 带String参数构造方法:调用父类super(message),给Throwable父类赋值异常提示信息
public class MyBusinessException extends Exception{
public MyBusinessException(){}
public MyBusinessException(String msg){
super(msg);
}
}
七、重写方法时的异常约束(面试+开发双重重点)

子类重写父类方法,异常声明有三条硬性规则:

1. 方法基础匹配:子类重写方法的方法名、参数列表、返回值类型必须和父类完全一致。

2. 访问权限约束:子类重写方法的访问修饰符权限,和父类等同或者更宽松(不能缩小权限)。

3. 异常抛出约束:子类重写方法,不能声明抛出父类方法未抛出、且层级更高的受检异常;仅能抛出父类已声明的异常、该异常的子类,或者完全不抛出异常。

http://www.gsyq.cn/news/1510529.html

相关文章:

  • MPC5744P汽车MCU:多核锁步架构与电机控制外设深度解析
  • MPC5676R通信与调试模块深度解析:FlexCAN、FlexRay与Nexus实战指南
  • 计算机毕业设计之酒店管理系统
  • 专升本资料全国统一的吗|考试科目|资料已整理
  • Windows热键侦探:三步快速找出谁“偷走“了你的快捷键
  • Prophet外部变量实战指南:从添加到归因的完整工程链
  • 2026:彭州除甲醛公司实测横评|5家主流品牌深度对比,本地靠谱机构优选和避坑攻略 - 专注室内空气检测治理
  • MPC509微控制器GPIO与中断控制器配置实战指南
  • 晋中市2026年本地黄金回收铂金白银回收哪家强?TOP5 正规门店榜单 +联系方式 - 开始就结束
  • 强力Windows防休眠工具NoSleep:如何让系统永不休眠的完整指南
  • Mythos:大模型逻辑一致性约束的实时推理范式
  • Word GPT-Plus:让AI助手在Microsoft Word中为你代笔
  • 岳阳市2026年本地黄金回收铂金白银回收哪家强?TOP5 正规门店榜单 +联系方式 - 嵩山路大王
  • 禁毒展馆展厅设备【毒品对人体的危害-滑轨版】
  • 基于ColdFire MCF5223x的嵌入式网络开发:RTOS与LwIP协议栈实战指南
  • 为什么你的腾讯游戏还在卡顿?3步智能解决ACE-Guard资源占用问题
  • 以下是一个完整的功率循环秒级测试模拟代码示例,包含模拟测试数据、配置界面、操作按钮、波形显示和数据存储功能
  • Windows驱动存储终极清理指南:DriverStoreExplorer完全使用教程
  • 保定市2026年市民高频选择的5家实体黄金回收白银回收铂金回收门店实地测评整理 - 奢金汇
  • 探索DSP56002EVM:24位音频DSP开发板的硬件架构与算法实现
  • 2026自贡出手黄金铂金白银回收避坑指南 5 家经营多年实体回收门店走访测评 + 详细地址(更新时间:2026-06-12_11:10:26) - 中业金奢再生回收中心
  • 中启乘数 CLup 6.x 高级集群管理与企业级运维实战指南(基于手册 10726 新增特性)
  • 弃用 WebDAV:坚果云 Obsidian 官方同步插件 (Nutstore Sync) 深度评测与配置指南
  • 亳州市2026年市民高频选择的5家实体黄金回收白银回收铂金回收门店实地测评整理 - 奢金汇
  • osc.js项目架构解析:深入理解双平台兼容性的实现原理
  • 芯片测试入门:手把手教你理解SCAN、BIST和ATPG(附真实项目经验)
  • `SimulateData` 方法用于生成功率循环秒级测试的模拟数据,包含周期性温度信号(加热和冷却阶段)、高斯噪声(标准差 0.5)和随机异常值(1% 概率,幅度 ±5)
  • i.MX+Linux嵌入式移动平台:硬件加速与开源生态的工程实践
  • NXP Kinetis KL2x系列MCU:低功耗USB连接与Cortex-M0+设计实战
  • 手机号逆向查询QQ号:3分钟破解账号遗忘难题的终极方案