【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应用程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/348013.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LM2576系列3A开关型DCDC BUCK降压稳压器

前言&#xff1a; 老款DCDC&#xff0c;使用历史几十年了&#xff0c;今天设计仍然使用这个DCDC的&#xff0c;是不合适的。主要缺点是开关频率较低只有几十Khz&#xff0c;导致需要使用较大感量的功率电感&#xff0c;这样的电感价格较高&#xff0c;且占用PCB空间较大&#…

【机器学习300问】114、什么是度量学习?三元组损失又是什么?

这些天都在加强自己的CV基本功&#xff0c;之前做过的人脸识别项目里有很多思考&#xff0c;在学习了这些基础知识后&#xff0c;我再次回顾了之前的人脸识别项目。我发现&#xff0c;很多之前困惑不解的问题现在都有了清晰的答案。 一、什么是度量学习&#xff1f; 度量学习也…

Spring框架是如何查找方法上的异步任务注解@Async

结论先行 Spring框架层面&#xff0c;查找方法上的注解的原理与机制是一样的。 在方法层面&#xff0c;Spring框架已经找到子类的Async注解&#xff0c;原因是查找注解会搜索整棵类型继承树&#xff0c;包括超类和实现的接口。 异步任务代码示例 Async注解&#xff0c;在父类…

0605 实际集成运算放大器的主要参数和对应用电路的影响

6.5.1 实际集成运放的主要参数 6.5.2 集成运放应用中的实际问题 6.5.2 集成运放应用中的实际问题

【python】tkinter GUI开发: Button和Entry的应用实战探索

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Spark参数配置不合理的情况

1.1 内存设置 &#x1f4be; 常见的内存设置有两类&#xff1a;堆内和堆外 &#x1f4a1; 我们作业中大量的设置 driver 和 executor 的堆外内存为 4g&#xff0c;造成资源浪费 &#x1f4c9;。 通常 executor 堆外内存在 executor.cores1 的时候&#xff0c;1g 足够了&…

傲医医疗集成引擎 Rhapsody 在超融合信创平台表现如何?

作者&#xff1a;SmartX 商业团队 黄玉辉 随着越来越多的医疗用户基于超融合基础设施实现 IT 基础架构信创转型&#xff0c;超融合信创架构在医疗业务场景中的实际表现也得到更多关注。尤其是集成平台业务场景——作为三甲医院互联互通评级中不可缺少的核心业务系统&#xff0…

条件判断if语句与case语句

一、条件测试 test命令进行条件测试&#xff0c;然后根据返回值来判断条件是否成立。 常用操作符&#xff1a; -e &#xff1a;既可以测试文件又可以测试目录是否存在 -d &#xff1a;测试目录是否存在 -f &#xff1a;测试文件是否存在 -r &#xff1a;测试当前用户是否…

delmia中机器人末端固定工具

1 需要在工具上面建立点 在Device Building模式下 2 然后通过 set tool可以设置

618值得购买的东西有哪些?618四款必囤好物清单分享!

随着618购物狂欢节的脚步日益临近&#xff0c;身为数码领域的资深爱好者&#xff0c;我深感有必要为大家推荐一系列经过精心挑选的数码产品精选。无论是热衷于科技前沿的探索者&#xff0c;还是希望通过智能设备提升生活品质的时尚达人&#xff0c;本文所介绍的每一款数码产品都…

【ARM Cache 与 MMU/MPU 系列文章 2.1 -- 什么是 Cache PoP 及 PoDP ?】

请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 文章目录 PoP 及 PoDPCache PoDPCache PoP应用和影响PoP 及 PoDP Cache PoDP 点对深度持久性(Point of Deep Persistence, PoDP)是内存系统中的一个点,在该点达到的任何写操作即使在系统供电…

初级网络工程师之从入门到入狱(三)

本文是我在学习过程中记录学习的点点滴滴&#xff0c;目的是为了学完之后巩固一下顺便也和大家分享一下&#xff0c;日后忘记了也可以方便快速的复习。 中小型网络系统综合实战实验 前言一、详细拓扑图二、LSW2交换机三、LSW3交换机四、LSW1三层交换机4.1、4.2、4.3、4.4、4.5、…

SolidWorks 2016 SP5安装教程

软件介绍 Solidworks软件功能强大&#xff0c;组件繁多。 Solidworks有功能强大、易学易用和技术创新三大特点&#xff0c;这使得SolidWorks 成为领先的、主流的三维CAD解决方案。 SolidWorks 能够提供不同的设计方案、减少设计过程中的错误以及提高产品质量。SolidWorks 不仅…

Web前端大作业:基于html+css+js的仿酷狗音乐项目(内附源码)

文章目录 一、项目介绍二、项目展示三、源码展示四、获取源码 一、项目介绍 课设是要仿照酷狗音乐的首页进行设计。酷狗音乐是国内知名的音乐应用程序,凭借其优秀的音乐库和智能推荐功能吸引了大量用户群体。模仿酷狗音乐的首页设计,可以让课设展现出专业水准,体现出对优秀产品…

后端开发面经系列 -- 小鹏汽车一面面经

小鹏汽车一面面经 公众号&#xff1a;阿Q技术站 来源&#xff1a;职言详情页 (maimai.cn) 文章目录 小鹏汽车一面面经1、String类型为什么不可变&#xff1f;1. 安全性2. 缓存和性能优化3. 哈希码缓存4. 类设计和接口5. 简单性和可读性 2、在浏览器中输入url地址到显示主页的过…

RV32A\CSR\Counters 指令集

RV32A\CSR\Counters指令集 一、RV32A指令集1、Load-Reserved/Store-Conditional InstructionsLR.WSC.W2、Atomic Memory OperationsAMOSWAP.WAMOADD.WAMOAND.WAMOXOR.WAMOOR.W二、CSR(Control and Status Register) 指令集CSRRWCSRRSCSRRCCSRRWICSRRSICSRRCI三、"Zicntr…

两种典型的嵌入式系统架构模式

大多数嵌入式系统都具备实时特征&#xff0c;那么&#xff0c;这种嵌入式系统的典型架构可概括为两种模式&#xff0c;即层次化模式架构和递归模式架构。 1.层次化模式架构 为了达到概念一致性&#xff0c;许多系统通过层次化的方法进行搭建。这样做的结果是&#xff1a;位于高…

力扣752. 打开转盘锁

Problem: 752. 打开转盘锁 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.用一个集合 deads 存储所有的“死锁”状态&#xff0c;一个集合 visited 存储所有已经访问过的状态&#xff0c;以避免重复访问&#xff0c;一个队列 q 进行广度优先搜索&#xff08;BF…

基于Python的AI动物识别技术研究

基于Python的AI动物识别技术研究 开发语言:Python 数据库&#xff1a;MySQL所用到的知识&#xff1a;Django框架工具&#xff1a;pycharm、Navicat、Maven 系统功能实现 系统的登录模块设计 本次设计的AI动物识别系统为了保证用户的数据安全&#xff0c;设计了登录的模块&…

永磁同步电机滞环电流控制(PI双闭环)matlab仿真模型

微♥“电击小子程高兴的MATLAB小屋”获取模型 1.滞环电流控制的原理 将给定的电流信号与反馈的电流信号进行比较&#xff0c;然后控制它俩之间的差值稳定在一个滞环范围内&#xff0c;若超出范围&#xff0c;则进行相应的调节操作。 操作如下叙述&#xff1a;假设以三相中的A相…