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

如何解决 Java 中的 IllegalArgumentException 异常?

非法参数异常(IllegalArgumentException)的抛出是为了表明一个方法被传递了一个非法参数。该异常扩展了 RuntimeException 类,因此属于在 Java 虚拟机(JVM)运行期间可能抛出的异常。它是一种未检查异常,因此不需要在方法或构造函数的 throws 子句中声明。

出现 java.lang.IllegalArgumentException 的原因

  • 当参数超出范围时。例如,百分比应介于 1 到 100 之间。如果用户输入的是 101,则将抛出 IllegalArugmentExcpetion。
  • 参数格式无效时。例如,如果我们的方法需要 YYYY/MM/DD 这样的日期格式,但如果用户传递的是 YYYY-MM-DD。那么我们的方法就无法理解,就会抛出 IllegalArugmentExcpetion。
  • 当一个方法需要非空字符串作为参数,但传递的却是空字符串时。

示例

public class Student {int m;public void setMarks(int marks) {if(marks < 0 || marks > 100)throw new IllegalArgumentException(Integer.toString(marks));elsem = marks;}public static void main(String[] args) {Student s1 = new Student();s1.setMarks(45);System.out.println(s1.m);Student s2 = new Student();s2.setMarks(101);System.out.println(s2.m);}
}

输出

45
Exception in thread "main" java.lang.IllegalArgumentException: 101at Student.setMarks(Student.java:5)at Student.main(Student.java:14)

解决 IllegalArgumentException 的步骤

  • 当抛出 IllegalArgumentException 时,我们必须检查 Java 堆栈跟踪中的调用堆栈,找出产生错误参数的方法。
  • IllegalArgumentException 非常有用,可用于避免应用程序的代码必须处理未经检查的输入数据的情况。
  • IllegalArgumentException 的主要用途是验证来自其他用户的输入。
  • 如果要捕获 IllegalArgumentException,我们可以使用 try-catch 块。通过这样做,我们可以处理某些情况。假设我们在 catch 代码块中加入代码,让用户有机会再次输入,而不是停止执行,尤其是在循环的情况下。

示例

import java.util.Scanner;
public class Student {public static void main(String[] args) {String cont = "y";run(cont);}static void run(String cont) {Scanner scan = new Scanner(System.in);while( cont.equalsIgnoreCase("y")) {try {System.out.println("Enter an integer: ");int marks = scan.nextInt();if (marks < 0 || marks > 100)throw new IllegalArgumentException("value must be non-negative and below 100");System.out.println( marks);} catch(IllegalArgumentException i) {System.out.println("out of range encouneterd. Want to continue");cont = scan.next();if(cont.equalsIgnoreCase("Y"))run(cont);}}}
}

输出

Enter an integer:
1
1
Enter an integer:
100
100
Enter an integer:
150
out of range encouneterd. Want to continue
y
Enter an integer:
http://www.lryc.cn/news/246785.html

相关文章:

  • Vue 双向数据绑定
  • 电脑开机过程中,程序的启动的顺序是怎么样的?
  • JSON详细教程
  • DSP介绍及CCS
  • 周期串(Periodic Strings)
  • C语言——猜凶手
  • 【TiDB】TiDB离线方式部署
  • android shape绘制半圆
  • 【开源】基于Vue和SpringBoot的个人健康管理系统
  • qt QString字符串常用转换
  • JAVA sql 查询3
  • PHP while 和 do-while 循环 学习资料
  • OpenJudge NOI 1.8 16:矩阵剪刀石头布 c语言
  • mysql 性能参数调优详解
  • 基于.net framework4.0框架下winform项目实现寄宿式web api
  • Vue中项目进行文件压缩与解压缩 (接口返回文件的url压缩包前端解析并展示出来,保存的时候在压缩后放到接口入参进行保存)
  • Linux shell编程学习笔记31:alias 和 unalias 操作 命令别名
  • Django JSONField/HStoreField SQL注入漏洞(CVE-2019-14234)
  • Unity中Shader的Standard材质解析(一)
  • 5.1 Windows驱动开发:判断驱动加载状态
  • Linux之高级IO
  • 进程和线程的关系
  • YOLOv5全网独家改进:NanoDet算法动态标签分配策略(附原创改进代码),公开数据集mAP有效涨点,来打造新颖YOLOv5检测器
  • 原生DOM事件、react16、17和Vue合成事件
  • 基于HTML+CSS+JavaScript的登录注册界面设计
  • BUUCTF [MRCTF2020]Ez_bypass 1
  • 基于Apache部署虚拟主机网站
  • 大数据平台/大数据技术与原理-实验报告--部署全分布模式HBase集群和实战HBase
  • 手写字符识别神经网络项目总结
  • 八、Lua数组和迭代器