【Java】解决Java报错:IllegalArgumentException

news2025/1/18 11:02:50

在这里插入图片描述

文章目录

      • 引言
      • 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应用程序。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++笔记之一个函数多个返回值的方法、STL::pair、STL::tuple、STL::tie的用法

C++笔记之一个函数多个返回值的方法、STL::pair、STL::tuple、STL::tie的用法 —— 2024-06-08 杭州 code review! 文章目录 C++笔记之一个函数多个返回值的方法、STL::pair、STL::tuple、STL::tie的用法一.从一个函数中获取多个返回值的方法1. 使用结构体或类2. 使用`std::t…

递归【2】(组合回溯(生成括号)、子集回溯(背包问题))

括号对 &#xff08;组合型回溯&#xff09; 分解成子问题&#xff0c;每一次添加括号分两步&#xff1a; if左括号小于n&#xff0c;加左括号&#xff0c;然后k(index1), if左括号大于有括号&#xff0c;加右括号&#xff0c;k(index1),然后收尾括号单独考虑&#xff0c;到…

Spark的开发环境配置

1. 介绍 这里主要记录一下&#xff0c;我们常用的maven配置&#xff0c;方便后期开发配置环境&#xff0c;避免每次都从零开始配置工程。 2. 工程目录 3. pom的配置 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven…

Vue11-键盘事件

一、键盘事件&#xff1a;keydown和keyup事件 keydown 和 keyup 是两种常用于处理键盘输入事件的JavaScript事件。当你在网页的输入框或其他可输入元素上按下或释放键盘上的某个键时&#xff0c;这些事件就会被触发。 1-1、keydown 事件 当用户按下键盘上的某个键时&#xff…

计算机组成原理——浮点加减运算的一道非计算例题

浮点加减运算的一道非计算例题 一、题目 文字描述 例6.31设机器数字长16位&#xff0c;阶码5位&#xff08;含1位阶符&#xff09;&#xff0c;基值为2&#xff0c;尾数11位&#xff08;含1位数符&#xff09;。 对千两个阶码相等的数按补码浮点加法完成后&#xff0c;由于规格…

Linux通过安装包配置环境变量(详细教程)

本章教程使用jdk1.8.0_241版本在Linux CentOS系统中,配置Java环境变量。 一、下载安装包 微云下载:https://share.weiyun.com/JeWZMDoh 二、上传安装包 将安装包上传到linux中的opt目录中 三、解压安装包 tar -xzvf jdk-8u241-linux-x64.tar.gz四、配置环境变量 vim /etc/p…

第6章 字典

第6章 字典 6.1 一个简单的字典6.2 使用字典6.2.1 访问字典中的值6.2.2 添加键值对6.2.3 先创建一个空字典6.2.4 修改字典中的值6.2.5 删除键值对6.2.6 由类似对象组成的字典6.2.7 使用 get()来访问值 6.3 遍历字典6.3.1 遍历所有键值对6.3.2 遍历字典中的所有键 6.3.3 按特定顺…

pytorch之猫狗识别项目

1. 导入资源包 资源包&#xff1a; import torchvision&#xff1a;PyTorch 提供的视觉库&#xff0c;包含了常用的计算机视觉模型架构、数据集以及图像转换工具。 from torchvision import datasets, models&#xff1a;导入 torchvision 中的 datasets 和 models 模块&#…

Anaconda软件:安装、管理python相关包

Anaconda的作用 一个python环境中需要有一个解释器, 和一个包集合. 解释器&#xff1a; 根据python的版本大概分为2和3. python2和3之间无法互相兼容, 也就是说用python2语法写出来的脚本不一定能在python3的解释器中运行. 包集合&#xff1a;包含了自带的包和第三方包, 第三…

Flutter基础 -- Flutter容器布局

目录 1. MaterialApp 1.1 组件定义 1.2 主要功能和属性 1.3 示例 2. 脚手架 Scaffold 2.1 定义 2.2 Scaffold 的属性 2.3 示例 PS: 对于 Scaffold 和 MaterialApp 3. 线性布局 Column Row 3.1 Row 3.2 Column 4. 盒模型 Box Model 4.1 定义 4.2 示例 5. 容器 C…

ubuntu20.04中设置包含ros节点的文件自启动

若文件里包含了ros话题的发布和接收&#xff0c;那么设置自启动时&#xff0c;应该首先将roscore设置为自启动。 首先确保roscore有一个systemd服务文件。如果还没有&#xff0c;需要在/etc/systemd/system/下创建一个。例如&#xff0c;一个基本的roscore.service文件可能如下…

html文件使用postcss-pxtorem适配移动端 使用tailwindcss库

项目截图 插件下载 npm i -D postcss8.4.38 postcss-cli10.1.0 postcss-pxtorem6.1.0 tailwindcss3.4.3postcss.config.js & tailwind.config.js postcss.config.js const pxToRem require(postcss-pxtorem) module.exports {plugins: [pxToRem({rootValue: 75,propLi…

[office] 快速删除excel中的空行和列的方法 #其他#学习方法#经验分享

快速删除excel中的空行和列的方法 用户在网上下载好的Excel表格打开之后发现有很多空白行&#xff0c;怎么样将这些空白行或单元格一次性删除掉呢?下面教大家在Excel中用定位一次性可以把空白行删除 用户在网上下载好的Excel表格打开之后发现有很多空白行&#xff0c;怎么样将…

【Unity】官方文档学习-光照系统

目录 1 前言 2 光照介绍 2.1 直接光与间接光 2.2 实时光照与烘焙光照 2.3 全局光照 3 光源 3.1 Directional Light 3.1.1 Color 3.1.2 Mode 3.1.3 Intensity 3.1.4 Indirect Multiplier 3.1.5 Shadow Type 3.1.6 Baked Shadow Angle 3.1.7 Realtime Shadows 3.1…

TriForce: 突破长序列生成瓶颈的分层投机解码技术

在人工智能领域&#xff0c;大型语言模型&#xff08;LLMs&#xff09;的长序列生成能力一直是研究的热点。然而&#xff0c;随着模型规模的增长&#xff0c;推理过程中的内存和计算瓶颈成为了限制其应用的主要障碍。为了解决这一问题&#xff0c;Carnegie Mellon University和…

[数据集][目标检测]盲道检测数据集VOC+YOLO格式2173张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2173 标注数量(xml文件个数)&#xff1a;2173 标注数量(txt文件个数)&#xff1a;2173 标注…

网络安全快速入门(十五)(下)手动创建用户及su,sudo命令

15.8 序言 前面我们已经大概了解了创建用户一些相关文件&#xff0c;接下来我们来手动创建用户&#xff0c;话不多说&#xff0c;我们直接开搞&#xff01;&#xff01;&#xff01; 15.9 手动创建用户&#xff1a; 一般来讲&#xff0c;我们创建用户通过useradd和passwd命令来…

如何合理使用群发短信呢?(短信接口JSON实例)

随着时代的发展&#xff0c;越来越多的营销推广也开始有线下转移到了线上&#xff0c;短信也变成了企业与用户之间交流沟通的桥梁&#xff0c;那么这么多的企业选择使用短信平台&#xff0c;到底群发短信好不好用呢&#xff1f;今天乐讯通短信平台就为大家来介绍一下群发短信营…

3D Gaussian Splatting for Real-Time Radiance Field Rendering

辐射场方法最近在基于多张照片或视频进行新视角合成方面取得了革命性进展。然而&#xff0c;实现高视觉质量仍然需要耗时且计算成本高的神经网络&#xff0c;而最近的快速方法不可避免地在速度和质量之间进行了权衡。对于无界和完整的场景&#xff08;而不是孤立的物体&#xf…

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

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