解决 Java 中的 IllegalArgumentException
- Java 中 IllegalArgumentException 类的层次结构
- Java 中的运行时异常与编译时异常
- 在 Java 中抛出并解决 IllegalArgumentException
-
在 Java 中使用
Try
和Catch
使用 Scanner 确定 IllegalArgumentException
本教程将通过显示 java.lang.object
类中的 java.lang.IllegalArgumentException
类对异常层次结构进行分类。之后,我们将执行三个 Java 编码块来演示非法参数异常。
最后,我们将展示如何摆脱它们并解释如何自定义它们。
Java 中 IllegalArgumentException 类的层次结构
触发此异常是因为我们可能给 Java 函数提供了无效参数。此异常扩展了运行时异常类,如下图所示。
因此,Java 虚拟机运行时可能会触发一个异常。但是,要完全掌握它,请查看以下 Java 类:
java.lang.object
:类层次结构的根是 Class 对象。java.lang.Throwable
:Throwable 类是所有 Java 错误和异常的超类。java.lang.Exception
:扩展 Throwable 类,该类识别实际应用程序可能想要捕获的情况。java.lang.RuntimeException
:运行时异常是 Java 虚拟机正常运行时可能产生的异常的超类。java.lang.IllegalArgumentException
:抛出以通知向方法提供了非法或不适当的参数。
illegalargumentexception 的层次结构图。
Java 中的运行时异常与编译时异常
尽管大多数人都熟悉其中的区别,但许多人仍然不了解其简单性。
下表说明了 Java 中运行时和编译时错误/异常类型之间的区别。
编号 | 主题 | 运行时错误 | 编译时错误 |
---|---|---|---|
1 | 异常 | 在 JVM 的正常执行过程中抛出 | 当 Java 程序的语义规则被破坏时,JVM 会将这个错误作为一个异常抛给程序。 |
2 | 参考资料 | 类运行时异常 | 编译器异常 |
3 | 解决方案 | 在执行和识别代码之后。 | 在代码的开发过程中。 |
在 Java 中抛出并解决 IllegalArgumentException
下面的程序会抛出一个非法参数异常,因为我们不能在数组列表的初始容量中传递一个负值作为参数。
示例 1:
package com.IllegalAE.util;
import java.util.ArrayList;
import java.util.List;
public class Example1 {
public static void main(String[] args) {
List<String> demoList = new ArrayList<>(-1);
demoList.add("Red");
demoList.add("Blue");
demoList.add("Green");
System.out.println(demoList);
}
}
输出:
如果我们没有在初始列表容量中传递负值,例如:List<String> demoList = new ArrayList<>(1);
,我们会得到以下结果。
输出:
[RED, GREEN, BLUE]
示例 2:
首先,你应该注意 int a
的值是 1000,而 int b
的值是 0。
package com.IllegalAE.util;
//class
public class Example2 {
//main function
public static void main(String[] args) {
//constructor
Demo2 examp2 = new Demo2 ();
//add 2 numbers
System.out.println(" The total of A and B is: "+examp2.addTwoNums(10,5));
}
}
class Demo2 {
public int addTwoNums(int a,int b)
{
//if the value of b is less than the value of a (trigger IllegalArgumentException with a message)
if(b<a)
{
throw new IllegalArgumentException("B is not supposed to be less than "+a);
}
//otherwise, add two numbers
return a+b;
}
} //class
输出:
主函数包含通过构造函数传递的对象。由于 b
的值小于 a
,所以触发了非法参数异常。
如果我们像下面的代码一样滑动 int a
和 b
的值,
System.out.println(" The total of A and B is: "+examp2.addTwoNums(0,1000));
输出:
The total of A and B is: 15
你还可以查看下面的演示。
你可以设置非法参数条件以获取正确的用户输入并控制你的逻辑流程。
同样,Java 不允许我们通过传递非法参数来破坏方法。它是为了让用户编写干净的代码并遵循标准的做法。
另一个原因是避免可能危及代码块流的非法执行。
在 Java 中使用 Try
和 Catch
使用 Scanner 确定 IllegalArgumentException
编写程序结构以使用 try
和 catch
异常以及 Java 扫描程序类来确定非法参数异常。
以下是你需要首先考虑的几点:
-
理解
java.util.Scanner
类。Scanner mySc = new Scanner(System.in); int demo = mySc.nextInt();
请注意,上面的代码允许用户阅读 Java 的
System.in
。 -
try...catch
异常处理:try { //It allows us to define a block of code that will be tested for errors while it runs. } catch(Exception e) { //It enables us to create a code block that will be invoked if an error occurs in the try block. }
我们将能够使用
try...catch
方法来利用非法参数异常,并以适合我们的方式对其进行修改。
例子:
package com.IllegalAE.util;
import java.util.Scanner;
public class IllegalArgumentExceptionJava {
public static void main(String[] args) {
String AddProduct = "+";
execute(AddProduct);
}
static void execute(String AddProduct) {
//allows user to read System.in
//tries code block for testing errors
try (Scanner nxtLINE = new Scanner(System.in)) {
//to ignore user specified case consideration
while( AddProduct.equalsIgnoreCase("+")) {
//The code inside try block will be tested for errors
try {
System.out.println("Please enter a new product ID: ");
int Productid = nxtLINE.nextInt();
if (Productid < 0 || Productid > 10)
throw new IllegalArgumentException();
System.out.println( "You entered: "+Productid); // if try block has no error, this will print
}
//The code within the catch block will be run if the try block has any error
catch(IllegalArgumentException i) {
System.out.println("Invalid Entry Detected!. Do you want to try it again?");// if try block had an error, this would print
AddProduct = nxtLINE.next();
if(AddProduct.equalsIgnoreCase("AddProduct"))
execute(AddProduct);
}
}
}
}
}
输出:
Sarwan Soomro is a freelance software engineer and an expert technical writer who loves writing and coding. He has 5 years of web development and 3 years of professional writing experience, and an MSs in computer science. In addition, he has numerous professional qualifications in the cloud, database, desktop, and online technologies. And has developed multi-technology programming guides for beginners and published many tech articles.
LinkedIn