【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);
    }

    @Test
    public void testSetAgeValid() {
        Main.setAge(25);  // 不应抛出异常
    }
}

结语

理解并有效处理IllegalArgumentException对于编写健壮的Java程序至关重要。通过本文提供的解决方案和预防措施,开发者可以有效避免和解决这类异常,提高代码质量和可靠性。希望本文能帮助你更好地理解和处理非法参数问题,从而编写出更加可靠的Java应用程序。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于phpstorm创建类和方法时带描述注释

展示效果&#xff1a; 1、使用phpstorm创建类文件时自带注释及注释编辑 步骤1&#xff1a; 步骤二&#xff1a; 内容&#xff1a; <?php /** * Desc: * author guowei * datetime $DATE $TIME */ #if (${NAMESPACE}) namespace ${NAMESPACE}; #end class ${NAM…

Prism 入门06,发布订阅(入门完结)

本章节介绍使用 Prism 框架的消息聚合器 IEventAggregator ,实现如何进行消息发布,订阅,取消订阅的功能 继续使用上一章节使用的 Prism WPF 空模板项目 BlankApp1 1.首先,在使用 Prism 框架当中,进行事件消息的发布和订阅之前,需要定义发布事件的事件消息模型。如下所示:…

day40--Redis(二)实战篇

实战篇Redis 开篇导读 亲爱的小伙伴们大家好&#xff0c;马上咱们就开始实战篇的内容了&#xff0c;相信通过本章的学习&#xff0c;小伙伴们就能理解各种redis的使用啦&#xff0c;接下来咱们来一起看看实战篇我们要学习一些什么样的内容 短信登录 这一块我们会使用redis共…

华为端云一体化开发 初始化云db表结构和表数据(实践2.0)(HarmonyOS学习第七课)

实例介绍&#xff1a;黑马鸿蒙刷题学习过程 1. 静态页面准备 借用黑马完成的页面&#xff0c;已经提供给大家一套写好的基本模板&#xff0c;大家直接将这套模板覆盖原有entry/src/main目录就可以 &#x1f4ce;main.ziphttps://www.yuque.com/attachments/yuque/0/2024/zip…

【Java】解决Java报错:NoClassDefFoundError

文章目录 引言1. 错误详解2. 常见的出错场景2.1 类路径配置错误2.2 依赖库缺失2.3 类文件被删除或损坏2.4 类加载器问题 3. 解决方案3.1 检查类路径配置3.2 检查依赖库3.3 检查类文件3.4 调试类加载器问题 4. 预防措施4.1 使用构建工具管理依赖4.2 定期进行构建和测试4.3 使用I…

番外篇-YOLOV10尝鲜

一、 番外篇-YOLOV10尝鲜 最近由清华大学的研究团队研发的最新的YOLOV10模型。这一新一代的YOLO模型专注于实时端到端的目标检测。YOLOv10在多个方面进行了改进&#xff0c;包括优化模型架构、消除非极大值抑制&#xff08;NMS&#xff09;后处理步骤&#xff0c;并引入了高效…

零刻SER8 AMD 8845Hs Ryzen AI 本地部署大语言模型教程!

零刻SER8 8845HS,配备了一个内置的 NPU&#xff08;神经网络处理单元&#xff09;&#xff0c;可以通过LM Studio语言大模型来部署己的 GPT 模型 AI 聊天机器人&#xff0c;AI 助手已迅速成为提高生产力、效率&#xff0c;甚至是头脑风暴的关键资源。在本地机器上运行 AI 聊天机…

端午搞个零花钱,轻松赚取创业的第一桶金!2024最受欢迎的创业项目,2024新的创业机会

好好的端午节&#xff0c; 净给我添堵&#xff01; 本来我打算在端午节愉快的玩耍&#xff0c; 结果一大早起床却看到舍友在给一堆设备充电&#xff0c; 然后装的整整齐齐&#xff0c; 满满一书包。 我好奇他小子这是要干嘛&#xff1f; 不会是打算今天回去给亲朋好友准备…

图神经网络(GNN)的原理及应用

什么是图神经网络 &#xff08;GNN&#xff09;&#xff1f; 图神经网络 &#xff08;GNN&#xff09; 是一种神经网络架构和深度学习方法&#xff0c;可以帮助用户分析图&#xff0c;使他们能够根据图的节点和边描述的数据进行预测。 图形表示数据点&#xff08;也称为节点&…

MacOS_奇安信天擎卸载指南,无需管理员密码

背景 奇安信天擎是一款基于云端的终端安全管理软件,在某些情况下,用户可能需要卸载该软件,例如 1、入职企业后使用的是自己的电脑,离职后监控软件还在 2、自己无意下载的软件或被病毒感染后强制下载的垃圾软件 3、员工看不惯企业监控自己的这个行为,使用技术手段屏蔽企业…

SQLite3(1):介绍安装与测试

目录 1、SQLite3介绍 2、SQLite3的优势和特性 3、SQLite3安装与测试 3.1 SQLite3安装 3.2 SQLite3测试 4、SQLite3简单使用 4.1 连接数据库文件 4.2 创建信息表 4.3 插入三个学生信息 4.4 确认信息 5、总结 1、SQLite3介绍 SQLite3是一种轻量级的关系型数据库管理系…

使用 CloudFlare Turnstile 解决跨境电商站的垃圾邮件侵扰

最近明月一个跨境电商代维客户的网站被垃圾邮件侵扰了,从最开始的每天几封疯狂到每天几百上千封垃圾邮件,几乎所有可拦截屏蔽的关键词都是随机可变的,简单的邮件客户端拦截基本已经没有任何效果了,在收到用户的求助后经过分析发现主要是利用网站在线咨询页面里的邮件发送造…

C++| 一维线性插值、imadjust函数

前言&#xff1a;最近要从Matlab代码改C代码&#xff0c;不能直接用Matlab生成的C代码&#xff0c;因为需要嵌入到已有项目中。Matlab本身有很多很方便的数学公式&#xff0c;但是在C里没有相关的库的话&#xff0c;需要自己实现。 一维线性插值、imadjust函数 一维线性插值原理…

Ubuntu项目部署

解压jdk tar -zxvf jdk-8u151-linux-x64.tar.gz 配置Java环境变量&#xff1a; vim ~/.bashrc export JAVA_HOME/root/soft/jdk1.8.0_151 export JRE_HOME${JAVA_HOME}/jre export CLASSPATH.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH${JAVA_HOME}/bin:$PATH 设置环境变…

公差基础(互换性和测量基础)

互换性概念&#xff1a; 图纸设计是理论的&#xff0c;理性的&#xff0c;没有误差的&#xff0c;但是实际上加工上市有误差的。 所以说&#xff0c;实际加工出来的零件是否符合要求&#xff0c;我们需要对图纸上的尺寸精度&#xff0c;几何精度&#xff0c;表面粗糙度进行说明…

【vector模拟实现】附加代码讲解

vector模拟实现 一、看源代码简单实现1. push_backcapacity&#xff08;容量&#xff09;sizereserve&#xff08;扩容&#xff09;operator[ ] &#xff08;元素访问&#xff09; 2. pop_back3. itorator&#xff08;迭代器&#xff09;4.insert & erase &#xff08;头插…

机器学习与数据挖掘知识点总结(一)

简介&#xff1a;随着人工智能&#xff08;AI&#xff09;蓬勃发展&#xff0c;也有越来越多的人涌入到这一行业。下面简单介绍一下机器学习的各大领域&#xff0c;机器学习包含深度学习以及强化学习&#xff0c;在本节的机器学习中主要阐述一下机器学习的线性回归逻辑回归&…

Day46 代码随想录打卡|二叉树篇---从中序与后序遍历序列构造二叉树

题目&#xff08;leecode T106&#xff09;&#xff1a; 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 方法&#xff1a;本题要通过中序遍历和后…

【面试干货】如何选择MySQL数据库存储引擎(MyISAM 或 InnoDB)

【面试干货】如何选择MySQL数据库存储引擎(MyISAM 或 InnoDB&#xff09; &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; MySQL数据库存储引擎是一个 关键 的考虑因素。MySQL提供了多种存储引擎&#xff0c;其中最常用的是 MyISAM 和 InnoD…

实习记录2

1.flowable框架参数传递大概流程 通过传递xml&#xff0c;传递到后端&#xff0c;然后后端去解析 2.vue封装组件 在 Vue.js 中创建可复用的自定义组件是一个常见的需求&#xff0c;这样可以提高代码的复用性和可维护性。下面是一个简单的步骤指南&#xff0c;帮助你创建一个…