0

0

Java中的IllegalArgumentException的处理技巧

P粉602998670

P粉602998670

发布时间:2026-01-11 16:54:57

|

245人浏览过

|

来源于php中文网

原创

illegalargumentexception 由方法内部抛出,不该捕获——它标识调用方传入非法参数的逻辑错误;应尽早校验并明确提示非法值与合法范围,优先使用 objects.requirenonnull 或 guava preconditions 简化断言。

java中的illegalargumentexception的处理技巧

IllegalArgumentException 是谁抛的,该不该捕获

它继承自 RuntimeException,属于 unchecked 异常,编译器不强制你 try-catch 或声明 throws。绝大多数情况下,你不该捕获它——因为它代表**调用方传入了非法参数**,是逻辑错误,不是运行时意外(比如网络超时、文件不存在)。捕获后吞掉或泛化处理,反而掩盖了 bug 的真实位置。

真正该做的是:在方法入口快速失败,用 IllegalArgumentException 明确指出错在哪。比如:

public void setAge(int age) {
    if (age < 0 || age > 150) {
        throw new IllegalArgumentException("age must be between 0 and 150, but got: " + age);
    }
    this.age = age;
}
  • 检查时机越早越好,别等计算到一半才报错
  • 消息里必须包含非法值(如 age 的实际值)和合法范围,方便调试
  • 避免只写 "Invalid argument" 这类空洞描述

用 Objects.requireNonNull 和 Guava 的 Preconditions 简化校验

手写 if (x == null) + throw 太啰嗦,且容易漏消息拼接。JDK 自带的 Objects.requireNonNull 能省力又清晰:

public void process(String name, List<Item> items) {
    Objects.requireNonNull(name, "name must not be null");
    Objects.requireNonNull(items, "items must not be null");
    // ...
}

Guava 的 Preconditions 更进一步,支持数值范围、集合非空、字符串非空白等常用断言:

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

ShoopD 网上商店系统
ShoopD 网上商店系统

用 php + mysql 驱动的在线商城系统,我们的目标为中国的中小企业及个人提供最简洁,最安全,最高效的在线商城解决方案,使用了自建的会员积分折扣功能,不同的会员组有不同的折扣,让您的商店吸引更多的后续客户。 系统自动加分处理功能,自动处理会员等级,免去人工处理的工作量,让您的商店运作起来更方便省事 采用了自建的直接模板技术,免去了模板解析时间,提高了代码利用效率 独立开发的购物车系统,使用最

下载
import static com.google.common.base.Preconditions.*;
// ...
checkArgument(age >= 0 && age <= 150, "age out of range: %s", age);
checkNotNull(name, "name cannot be null");
checkState(!items.isEmpty(), "items list is empty");
  • checkArgument 对应参数合法性(即 IllegalArgumentException 场景)
  • checkState 用于对象内部状态非法(抛 IllegalStateException
  • 所有方法都支持格式化消息,避免字符串拼接开销

构造函数里抛 IllegalArgumentException 的特殊注意事项

构造函数是对象生命周期起点,这里抛 IllegalArgumentException 尤其关键——它意味着对象根本没创建成功。但要注意两个易错点:

  • 不要在构造函数里调用可被子类重写的方法(this.xxx()),否则可能触发未初始化对象上的逻辑,导致 NPE 或更隐蔽错误
  • 如果构造参数需转换(如 StringLocalDate),解析失败时别直接抛 DateTimeParseException,而应包装为 IllegalArgumentException,保持异常语义统一
  • 避免在构造函数里做耗时操作(如远程校验、文件读取),这会让异常抛出变得不可预测,也违背“构造即验证”原则

单元测试里必须覆盖 IllegalArgumentException 场景

既然你主动抛这个异常,就得证明它在非法输入下真能触发。JUnit 5 推荐用 assertThrows 显式断言:

@Test
void shouldThrowIAEWhenAgeIsNegative() {
    IllegalArgumentException ex = assertThrows(
        IllegalArgumentException.class,
        () -> new Person(-5)
    );
    assertTrue(ex.getMessage().contains("age"));
}

注意别只测 null,还要覆盖边界值、负数、超大数、非法字符串等典型非法输入。Mockito 等框架无法帮你测这类底层校验,必须靠真实调用。

最常被忽略的是:当多个参数同时非法时,只抛第一个检查的异常,后续校验不会执行。所以参数检查顺序要有逻辑——先判 null,再判空集合,最后判业务规则,这样错误信息才最贴近用户意图。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
软件测试常用工具
软件测试常用工具

软件测试常用工具有Selenium、JUnit、Appium、JMeter、LoadRunner、Postman、TestNG、LoadUI、SoapUI、Cucumber和Robot Framework等等。测试人员可以根据具体的测试需求和技术栈选择适合的工具,提高测试效率和准确性 。

463

2023.10.13

java测试工具有哪些
java测试工具有哪些

java测试工具有JUnit、TestNG、Mockito、Selenium、Apache JMeter和Cucumber。php还给大家带来了java有关的教程,欢迎大家前来学习阅读,希望对大家能有所帮助。

313

2023.10.23

Java 单元测试
Java 单元测试

本专题聚焦 Java 在软件测试与持续集成流程中的实战应用,系统讲解 JUnit 单元测试框架、Mock 数据、集成测试、代码覆盖率分析、Maven 测试配置、CI/CD 流水线搭建(Jenkins、GitHub Actions)等关键内容。通过实战案例(如企业级项目自动化测试、持续交付流程搭建),帮助学习者掌握 Java 项目质量保障与自动化交付的完整体系。

29

2025.10.24

guava包作用
guava包作用

guava是一个java库,增强了java标准库,提供更有效率和易于使用的集合、实用程序、缓存和并发工具。想了解更多guava的相关内容,可以阅读本专题下面的文章。

271

2024.05.29

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1010

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

254

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1089

2024.03.01

if什么意思
if什么意思

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

846

2023.08.22

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

4

2026.03.10

热门下载

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

精品课程

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

共23课时 | 4.3万人学习

C# 教程
C# 教程

共94课时 | 11.1万人学习

Java 教程
Java 教程

共578课时 | 80.1万人学习

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

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