如何在Java中解决IllegalArgumentException?
一个抛出:IllegalArgumentException 是为了表明一个方法传递了非法参数异常。该异常扩展了RuntimeException 类,因此属于Java虚拟机(JVM)运行期间可能引发的那些异常。这是一个未经检查的异常,因此,不需要在方法或构造函数的throws子句中声明它。
java.lang.IllegalArgumentException的原因
当参数超出范围时。例如,百分比应该在1到100之间。如果用户输入101,则将抛出IllegalArugmentExcpetion 。
当参数格式无效时。例如,如果我们的方法需要类似YYYY/MM/DD的日期格式,但是用户正在传递YYYY-MM-DD。然后我们的方法无法理解,然后将抛出IllegalArugmentExcpetion 。
当方法需要非空字符串作为参数但传递了空字符串时。
例1
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:15)
解决IllegalArgumentException的步骤
当抛出:IllegalArgumentException 被抛出,我们必须检查在Java中的堆栈跟踪调用堆栈,并找到产生错误的参数的方法。
该抛出:IllegalArgumentException 是非常有用的,可以用来避免在应用程序代码必须处理未经检查输入数据的情况。
此IllegalArgumentException 的主要用途是验证来自其他用户的输入。
如果我们要捕获IllegalArgumentException, 则可以使用try-catch块。这样,我们可以处理一些情况。假设在catch块中,如果我们放置代码使用户有另一个机会再次输入而不是停止执行,尤其是在循环的情况下,则可以停止执行。
例2
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: