📌  相关文章
📜  如何解决Java中的 IllegalArgumentException?

📅  最后修改于: 2022-05-13 01:54:57.412000             🧑  作者: Mango

如何解决Java中的 IllegalArgumentException?

程序执行期间发生的意外事件称为Exception 。这可能是由于多种因素造成的,例如无效的用户输入、网络故障、内存限制、尝试打开不存在的文件等。

如果发生异常,则会生成一个 Exception 对象,其中包含 Exception 的位置、名称和类型。这必须由程序处理。如果没有处理,它会通过默认的异常处理程序,导致程序异常终止。

非法参数异常

IllegalArgumentException 是Java.lang.RuntimeException 的子类。 RuntimeException,顾名思义,在程序运行时发生。因此,它不会在编译时检查。

IllegalArgumentException 原因

当向方法传递非法或不合适的参数时,会抛出 IllegalArgumentException。

下面的程序有一个单独的线程,它会暂停,然后尝试打印一个句子。这种暂停是使用 sleep 方法实现的,该方法接受以毫秒为单位的暂停时间。 Java明确定义这个时间必须是非负的。让我们看看传入一个负值的结果。

演示 IllegalArgumentException 的程序:

Java
// Java program to demonstrate IllegalArgumentException
public class Main {
  
    public static void main(String[] args)
    {
  
        // Create a simple Thread by
        // implementing Runnable interface
        Thread t1 = new Thread(new Runnable() {
            public void run()
            {
                try {
                    // Try to make the thread sleep for -10
                    // milliseconds
                    Thread.sleep(-10);
                }
                catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(
                    "Welcome To GeeksforGeeks!");
            }
        });
  
        // Name the thread as "Test Thread"
        t1.setName("Test Thread");
  
        // Start the thread
        t1.start();
    }
}


Java
// Java program to demonstrate Solution to
// IllegalArgumentException
  
public class Main {
  
    public static void main(String[] args)
    {
  
        // Create a simple Thread by
        // implementing Runnable interface
        Thread t1 = new Thread(new Runnable() {
            public void run()
            {
                try {
                    // Try to make the thread sleep for 10
                    // milliseconds
                    Thread.sleep(10);
                }
                catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(
                    "Welcome To GeeksforGeeks!");
            }
        });
  
        // Name the thread as "Test Thread"
        t1.setName("Test Thread");
        // Start the thread
        t1.start();
    }
}


输出:

Exception in thread "Test Thread" java.lang.IllegalArgumentException: 
timeout value is negative
    at java.base/java.lang.Thread.sleep(Native Method)
    at Main$1.run(Main.java:19)
    at java.base/java.lang.Thread.run(Thread.java:834)

诊断与解决方案

堆栈跟踪是调查异常问题根本原因的终极资源。上面的 Stack Trace 可以分解如下。

第 1 部分:这部分命名发生异常的线程。在我们的例子中,异常发生在“测试线程”中。

第 2 部分:这部分命名异常的类。上面的例子中创建了一个“Java.lang.IllegalArgumentException”类的异常对象。

第 3 部分:这部分说明发生异常的原因。在上面的示例中,异常发生是因为使用了非法的负超时值。

第 4 部分:这部分列出了导致异常发生的所有方法调用,从第一次发生异常的方法开始。在上面的例子中,异常首先发生在Thread.sleep() 方法。

从上面的分析中,我们得出结论,在 Thread.sleep() 方法中发生了 IllegalArgumentException,因为它传递了一个负超时值。这些信息足以解决问题。让我们相应地对上述代码进行更改并传递一个正超时值。

下面是问题陈述的实现:

Java

// Java program to demonstrate Solution to
// IllegalArgumentException
  
public class Main {
  
    public static void main(String[] args)
    {
  
        // Create a simple Thread by
        // implementing Runnable interface
        Thread t1 = new Thread(new Runnable() {
            public void run()
            {
                try {
                    // Try to make the thread sleep for 10
                    // milliseconds
                    Thread.sleep(10);
                }
                catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(
                    "Welcome To GeeksforGeeks!");
            }
        });
  
        // Name the thread as "Test Thread"
        t1.setName("Test Thread");
        // Start the thread
        t1.start();
    }
}
输出
Welcome To GeeksforGeeks!