一文讲解如何解决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)); else m = 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: 101
at 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:
附:IllegalArgumentException异常常见场景
方法参数校验
在方法中对参数进行校验是一种常见的场景,以确保参数的合法性。当方法接收到一个非法的参数时,可以抛出IllegalArgumentException异常。
public void doSomething(int value) { if (value < 0 || value > 100) { throw new IllegalArgumentException("参数value的取值范围必须在[0, 100]之间"); } // 其他业务逻辑 }
构造方法参数校验
在构造方法中对参数进行校验同样是一种常见的场景。当构造方法接收到一个非法的参数时,可以抛出IllegalArgumentException异常。
public class Person { private String name; private int age; public Person(String name, int age) { if (name == null || name.isEmpty()) { throw new IllegalArgumentException("参数name不能为空"); } if (age < 0 || age > 150) { throw new IllegalArgumentException("参数age的取值范围必须在[0, 150]之间"); } this.name = name; this.age = age; } }
API调用参数校验
在调用第三方API时,有时需要对传入的参数进行校验,以确保参数的合法性。当API接收到一个非法的参数时,可以抛出IllegalArgumentException异常。
public class UserService { public void createUser(String username, String password) { if (username == null || username.isEmpty()) { throw new IllegalArgumentException("参数username不能为空"); } if (password == null || password.isEmpty()) { throw new IllegalArgumentException("参数password不能为空"); } // 调用第三方API创建用户 } }
总结
到此这篇关于如何解决Java中的IllegalArgumentException异常的文章就介绍到这了,更多相关Java中IllegalArgumentException异常解决内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
controller接口跳转到另一个controller接口的实现
这篇文章主要介绍了controller接口跳转到另一个controller接口的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-09-09使用Spring RestTemplate 详解实践使用及拓展增强
这篇文章主要介绍了使用Spring RestTemplate 详解实践使用及拓展增强,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-10-10
最新评论