news 2026/5/7 19:08:25

【Java基础(九)】异常

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Java基础(九)】异常

定义

异常(Exception),指在程序的运行过程中,发生了不正常的现象,阻止了程序的运行,称之为发生异常。

语法

try{// 这里放入可能出现异常的代码}catch(Exceptionex){// 1. 这里放入处理异常的代码,如果try代码出现异常,则会执行此处代码// 2. 若try中没有异常,则不会执行此处代码|------------------------||// 可以有多重catch ||// 会从上往下判断 ||// 只会执行其中一个 ||}catch(Exceptionex){||------------------------|}finally{// 此处放入使用要执行的代码,无论是否发生异常// 唯一的例外:遇到System.exit()时不会执行此处代码}

异常分类

对比维度Error (错误)Exception (异常)
本质不可恢复的严重系统级问题。可恢复的程序运行时问题。
产生原因JVM层面的资源耗尽或系统崩溃,如内存溢出、栈溢出。程序逻辑错误或外部环境因素,如文件不存在、空指针。
处理方式不应被捕获。程序通常只能终止。应该被捕获和处理,使程序能优雅地继续或退出。
常见示例OutOfMemoryError(内存溢出)
StackOverflowError(栈溢出)
NullPointerException(空指针)
IOException(IO异常)

throw 和 throws的区别

位置内容作用
throw方法内部throw + 异常对象制造异常,抛出异常
throws方法的签名处、声明处throws + 异常类型告诉方法的调用者,这个方法可能出现的异常

异常分类:检查型异常 vs 非检查型异常

对比维度检查型异常 (Checked Exception)非检查型异常 (Unchecked Exception / RuntimeException)
继承关系Exception的子类(RuntimeException除外)RuntimeException的子类
编译器要求强制处理 (try-catchthrows)不强制处理
产生原因外部环境因素(开发者无法完全避免)程序逻辑错误(开发者应通过编码避免)
处理策略必须显式处理,以应对可预见的失败。应通过代码审查和防御性编程来根除,而非捕获。
典型示例IOException,SQLExceptionNullPointerException,ArrayIndexOutOfBoundsException

注意

重载和重写关于异常的不同处理

重写时抛出的异常必须小于等于父类异常
重载则无关

自定义异常
  1. 编码时可以自定义异常,需继承自Exception。
  2. 如果继承的是运行时异常,使用时无需额外处理。
  3. 如果继承的是检查异常,使用时需要try-catch捕获或者throws向上抛。

异常处理机制

try-catch-finally:异常处理的基础结构

基本结构与执行流程

  • try 块:包裹可能抛出异常的代码。 catch 块:捕获并处理特定类型的异常。一个 try 块后可以跟多个 catch 块。
    finally 块:无论是否发生异常,也无论 try 或 catch 中是否有 return 语句,finally
    块中的代码几乎总会执行。它常用于资源清理,如关闭连接、释放锁等。

注意点

  1. 慎用 finally 中的 return
    • 在 finally 块中使用 return 语句会覆盖 try 或 catch 块中的返回值,可能导致异常信息丢失或返回错误的结果,应极力避免

try-with-resources:自动资源管理

try-with-resources 是 JDK7 引入的语法,只要实现了 AutoCloseable 接口的资源(流、连接、锁等),都可以在 try 后声明,执行完毕会自动关闭,不用手动写 finally,代码更简洁、避免漏关资源

语法与工作原理
资源在 try 关键字后的括号内声明和初始化。当 try 块执行完毕(无论是正常结束还是因异常退出),JVM会自动按照声明的逆序调用资源的 close() 方法。

// 语法示例try(FileInputStreamfis=newFileInputStream("test.txt");BufferedReaderbr=newBufferedReader(newInputStreamReader(fis))){// 使用资源Stringline=br.readLine();}catch(IOExceptione){// 处理异常}// 在这里,br 和 fis 会被自动关闭,无需 finally 块

关键点

  • 资源声明在 try(…) 内部,JVM 自动调用 close()
  • 关闭顺序与声明顺序相反
  • 支持同时声明多个资源,用分号分隔
  • 所有InputStream/OutputStream、Connection、Statement、RandomAccessFile 等都已实现AutoCloseable

自定义异常

自定义异常的核心目的是让异常携带业务语义。

核心要素
一个优秀的自定义异常类通常包含以下要素:

  • 继承体系:
    • 业务异常:通常继承 RuntimeException(非检查型),避免在方法签名上堆砌 throws,保持代码整洁。
    • 强制处理异常:继承 Exception(检查型),适用于调用方必须处理的场景(如参数校验失败)。
  • 错误码:用于前端或调用方快速识别错误类型,而不必依赖易变的错误消息文本。
  • 上下文信息:如 userId, orderId 等,帮助定位具体是哪条数据出了问题
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/10 9:07:22

【EDA D触发器 新建工程和仿真详细步骤】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、EDA新建工程1.新建工程2.新建.v3.编译3.编译成功 二、仿真配置1.生成测试文件2.配置仿真文件 三、编译仿真四.手把手教学视频五、注意事项5.1 仿真测试文件…

作者头像 李华
网站建设 2026/4/10 9:05:59

终极音乐自由:3分钟掌握NCM格式转换的完整指南

终极音乐自由:3分钟掌握NCM格式转换的完整指南 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为从网易云音乐下载的歌曲无法在其他设备播放而烦恼吗?ncmdump作为一款专业的NCM格式转换工具,能…

作者头像 李华
网站建设 2026/4/10 9:05:45

罗技鼠标宏配置:5步实现PUBG精准压枪的完整指南

罗技鼠标宏配置:5步实现PUBG精准压枪的完整指南 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 还在为PUBG中难以控制的武器后坐力而…

作者头像 李华
网站建设 2026/4/10 9:02:32

【算法日记】Day 10 动态规划专题——区间DP之基于两侧端点的讨论

Abstract:#动态规划 #区间DP #博弈 1. 题目 题目:LeetCode 486. 预测赢家核心思路:两人轮流从数组两端取数,最终分数高者赢。定义f(l, r)表示在子数组nums[l…r]中当前先手玩家能获得的最大分数。转移时,若取左端num…

作者头像 李华
网站建设 2026/4/10 9:02:26

SiameseUIE模型解析:从原理到部署全解读

SiameseUIE模型解析:从原理到部署全解读 1. 引言 信息抽取是自然语言处理中的核心任务之一,它能够从非结构化的文本中提取出结构化的信息。传统的抽取模型通常需要针对每个任务进行专门的训练,这不仅耗时耗力,而且难以适应新的抽…

作者头像 李华
网站建设 2026/4/10 9:00:54

Windows热键冲突终极解决方案:Hotkey Detective使用指南

Windows热键冲突终极解决方案:Hotkey Detective使用指南 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective 你是否…

作者头像 李华