0

0

在Java中catch块中的异常如何选择_Java异常捕获顺序说明

P粉602998670

P粉602998670

发布时间:2026-02-08 11:02:02

|

919人浏览过

|

来源于php中文网

原创

Java中catch块异常类型必须按子类到父类顺序排列,否则编译报错;推荐多异常捕获(|分隔)而非instanceof判断;避免首catch使用Exception或Throwable,须显式处理受检异常。

在java中catch块中的异常如何选择_java异常捕获顺序说明

catch 块中异常类型必须从子类到父类排列

Java 要求 catch 块的声明顺序必须是“更具体的异常在前,更通用的在后”,否则编译直接报错 Unreachable catch block。这是因为 JVM 按代码顺序逐个匹配,一旦前面的父类异常(如 Exception)能捕获当前异常,后面的子类异常(如 NullPointerException)就永远无法执行。

  • ✅ 正确写法:catch (NullPointerException e)catch (IllegalArgumentException e)catch (Exception e)
  • ❌ 错误写法:catch (Exception e) 放在 catch (NullPointerException e) 前面 → 编译失败
  • 注意:同级异常(如 IOExceptionSQLException)可以任意顺序,只要不互相继承

多 catch 用法优先于单 catch + instanceof 判断

Java 7 引入了多异常捕获语法(| 分隔),比在单个 catch (Exception e) 里用 instanceof 手动分发更安全、更清晰,也避免了类型擦除带来的误判风险。

  • 推荐写法:catch (IOException | SQLException e) —— 共享同一段处理逻辑时简洁明确
  • 不推荐:catch (Exception e) { if (e instanceof IOException) { ... } else if (e instanceof SQLException) { ... } } —— 冗长且容易漏判新异常子类
  • 注意:| 只支持并列的、无继承关系的异常类型;不能写 catch (Exception | RuntimeException e)(后者是前者的子类)

不要用 Exception 或 Throwable 作为第一个 catch

catch (Exception e) 或更糟的 catch (Throwable t) 放在最前面,会吞掉本该被精确处理的异常,掩盖真实问题,还可能让 finally 中的资源清理失效(比如 InterruptedException 被静默吃掉,线程中断状态丢失)。

快剪辑
快剪辑

国内⼀体化视频⽣产平台

下载
  • 典型陷阱:网络调用中 catch (Exception e) 吞掉了 SocketTimeoutException,导致重试逻辑失效
  • 建议层级:catch (SpecificBusinessException e)catch (IOException e)catch (RuntimeException e)(可选兜底)
  • catch (Error e) 几乎不该出现——Error 表示 JVM 级严重问题(如 OutOfMemoryError),不应尝试恢复

检查是否遗漏了受检异常(checked exception)

方法签名中声明的受检异常(如 IOExceptionSQLException)必须被显式处理:要么在当前方法 try-catch,要么向上 throws。如果只写了 catch (RuntimeException e),编译器会报错“unreported exception XXX; must be caught or declared to be thrown”。

立即学习Java免费学习笔记(深入)”;

  • 常见疏忽:调用 FileInputStream 构造器或 ObjectOutputStream.writeObject() 时忽略 IOException
  • IDE 通常高亮提示,但手动删掉自动生成的 catch 块后容易忘记补上对应类型
  • 注意:catch (Exception e) 能覆盖所有受检异常,但属于“过度捕获”,违背异常分类设计初衷
实际编码中最容易出问题的,不是记不住语法,而是写完一个 try 块后顺手补了个 catch (Exception e) 就提交——它看起来“保险”,却让后续维护者完全看不到这里真正可能抛什么异常。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

798

2023.08.22

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

798

2023.08.22

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

798

2023.08.22

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

331

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

317

2023.10.25

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

613

2023.08.10

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

36

2026.02.06

java多线程方法汇总
java多线程方法汇总

本专题整合了java多线程面试题、实现函数、执行并发相关内容,阅读专题下面的文章了解更多详细内容。

16

2026.02.06

1688阿里巴巴货源平台入口与批发采购指南
1688阿里巴巴货源平台入口与批发采购指南

本专题整理了1688阿里巴巴批发进货平台的最新入口地址与在线采购指南,帮助用户快速找到官方网站入口,了解如何进行批发采购、货源选择以及厂家直销等功能,提升采购效率与平台使用体验。

271

2026.02.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.3万人学习

C# 教程
C# 教程

共94课时 | 8.9万人学习

Java 教程
Java 教程

共578课时 | 60.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号