一文讲解如何解决Java中的IllegalArgumentException异常

 更新时间:2024年03月02日 14:49:39   作者:SEO_juper  
这篇文章主要给大家介绍了关于如何解决Java中IllegalArgumentException异常的相关资料,IllegalArgumentException是Java中的一个标准异常类,通常在方法接收到一个不合法的参数时抛出,需要的朋友可以参考下

前言

非法参数异常(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接口的实现

    这篇文章主要介绍了controller接口跳转到另一个controller接口的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • 使用Spring RestTemplate 详解实践使用及拓展增强

    使用Spring RestTemplate 详解实践使用及拓展增强

    这篇文章主要介绍了使用Spring RestTemplate 详解实践使用及拓展增强,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • WebSocket无法注入属性的问题及解决方案

    WebSocket无法注入属性的问题及解决方案

    这篇文章主要介绍了WebSocket无法注入属性的问题及解决方法,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • Java 递归重难点分析详解与练习

    Java 递归重难点分析详解与练习

    一说起递归,我想每个人都不陌生。举个从小就听过的例子:从前有座山,山里有座庙,庙里有个和尚,和尚在讲故事,从前有座山,山里有座庙,庙里有个和尚,和尚在讲故事,从前有座山,要理解递归,就得先了解什么是递归,实际上这句话就是一个递归
    2021-11-11
  • RocketMQ线程池创建实现原理详解

    RocketMQ线程池创建实现原理详解

    这篇文章主要为大家介绍了RocketMQ线程池创建实现原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • java中this关键字的详细使用介绍

    java中this关键字的详细使用介绍

    大家好,本篇文章主要讲的是java中this关键字的详细使用介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2022-01-01
  • SpringBoot与velocity的结合的示例代码

    SpringBoot与velocity的结合的示例代码

    本篇文章主要介绍了SpringBoot与velocity的结合的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • 浅谈synchronized加锁this和class的区别

    浅谈synchronized加锁this和class的区别

    synchronized 是 Java 语言中处理并发问题的一种常用手段,本文主要介绍了synchronized加锁this和class的区别,具有一定的参考价值,感兴趣的可以了解一下
    2021-11-11
  • Java使用IO模拟注册登录

    Java使用IO模拟注册登录

    这篇文章主要为大家详细介绍了Java使用IO模拟注册登录,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • JDK环境变量配置教程分享

    JDK环境变量配置教程分享

    这篇文章主要为大家分享了JDK环境变量配置教程,JDK环境变量的配置,是java开发中必备的配置
    2016-05-05

最新评论