0

0

在Java中怎么选择适当的异常类_Java异常类选择标准解析

P粉602998670

P粉602998670

发布时间:2026-02-17 14:23:03

|

368人浏览过

|

来源于php中文网

原创

应优先用 runtimeexception 表示逻辑错误(如参数非法、状态不符),受检异常仅用于需调用方显式恢复的外部失败(如网络超时);illegalargumentexception 用于参数校验,illegalstateexception 用于状态校验;自定义异常默认继承 runtimeexception,避免无意义的 throws 声明。

在java中怎么选择适当的异常类_java异常类选择标准解析

该用 RuntimeException 还是受检异常?

Java 异常选择的核心分歧就在这里:是否强制调用方处理。如果异常代表程序逻辑错误(比如传了 null 给不允许为空的参数),应该用 RuntimeException 子类;如果异常代表外部可恢复的失败(比如文件不存在、网络超时),且你希望调用方明确决策——重试、降级或抛出,那就用受检异常(Exception 的非 RuntimeException 子类)。

常见误用:把数据库连接失败包装成 RuntimeException,导致上层完全忽略重连逻辑;或者把 IllegalArgumentException 声明为受检异常,强迫所有调用点写 try-catch,违背语义。

  • 检查方法签名是否已有 throws —— 如果已有多个受检异常,新增一个要谨慎,避免接口污染
  • 看异常是否可能被上层捕获并有意义地处理:能重试/切换策略的,倾向受检;只能记录日志后崩溃的,用运行时异常
  • Spring 等主流框架默认将多数底层异常(如 JDBC 异常)转为 RuntimeException,不是因为“不该检查”,而是认为数据访问层失败通常不可预期恢复,由统一异常处理器兜底更合理

IllegalArgumentExceptionIllegalStateException 怎么分?

两者都是 RuntimeException,区别在于“错在输入”还是“错在状态”。前者针对方法参数非法(例如传了负数给表示数量的参数),后者针对对象当前状态不满足执行前提(例如调用 iterator.next() 但已到末尾,或对已关闭的流再读取)。

容易混淆的点:看似是参数问题,实则是状态问题。比如向一个只允许添加一次的容器重复添加,抛 IllegalStateException 更准确——不是参数错了,是容器状态已不允许该操作。

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

NoCode
NoCode

美团推出的零代码应用生成平台

下载
  • IllegalArgumentException:校验发生在方法入口,独立于对象生命周期
  • IllegalStateException:校验依赖对象内部状态(如 private boolean closed),且该状态可能随时间变化
  • 不要为了省事统一用 IllegalArgumentException,IDE 和静态分析工具(如 ErrorProne)会据此做语义检查,用错会掩盖真实问题

自定义异常要不要继承 RuntimeException

绝大多数情况下要。除非你能明确说出“为什么必须让每个调用方都声明 throws”,否则默认走运行时异常。自定义异常的本质是提供更精确的错误语义和携带上下文信息(比如订单ID、用户ID),而不是制造调用负担。

典型反例:定义一个 OrderValidationException extends Exception,结果所有 service 方法都得加 throws OrderValidationException,而实际业务中它永远被立即捕获并转成 HTTP 400 响应——这种受检设计纯属冗余。

  • 如果异常需要被特定层级捕获(如网关层统一拦截认证失败),用运行时异常 + 特定基类(如 AuthException extends RuntimeException),配合 AOP 或全局异常处理器
  • 若必须带检查(极少见,如某些金融核心系统要求所有业务异常显式声明),确保有配套的文档和模板代码,否则开发者会绕过(比如直接 throw new RuntimeException(...))
  • 自定义异常构造函数务必支持 cause 参数,方便保留原始堆栈(new MyException("msg", cause)

为什么 NullPointerException 不该手动 throw?

它专用于 JVM 在解引用 null 时自动抛出,语义是“程序有 bug,变量没初始化或意外置空”。手动 throw NullPointerException 混淆了故障根源:你是想报参数为空(该用 Objects.requireNonNull),还是真遇到了 JVM 层面的空指针?

JDK 7+ 后,Objects.requireNonNull 已成为标准方式。它抛的是 NullPointerException,但语义清晰、堆栈指向调用点而非深层执行路径,且支持自定义消息。

  • 禁止:if (obj == null) throw new NullPointerException();
  • 推荐:Objects.requireNonNull(obj, "obj must not be null");
  • 注意 requireNonNull 返回非空值,可链式使用:process(Objects.requireNonNull(input))
  • 第三方库(如 Guava)的 Preconditions.checkNotNull 行为类似,但 JDK 原生已足够
真正难的不是记住类名,是判断“这个错误,此刻该由谁、以什么方式响应”。很多团队的异常混乱,根源不在选错类,而在没定义清楚各层的错误责任边界——比如 DAO 层该不该把 SQL 语法错误转成业务异常,还是原样上抛。这比继承哪个父类重要得多。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

965

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

334

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

376

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1696

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

370

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

1252

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

585

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

436

2024.04.29

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

283

2026.02.13

热门下载

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

精品课程

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

共23课时 | 3.6万人学习

C# 教程
C# 教程

共94课时 | 9.6万人学习

Java 教程
Java 教程

共578课时 | 66.9万人学习

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

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