一文讲解如何解决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异常解决内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java使用Cookie判断用户登录情况的方法

    java使用Cookie判断用户登录情况的方法

    这篇文章主要为大家详细介绍了java使用Cookie判断用户登录情况,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • 高吞吐、线程安全的LRU缓存详解

    高吞吐、线程安全的LRU缓存详解

    这篇文章主要介绍了高吞吐、线程安全的LRU缓存详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • java中对象和Map互相转换的几种常见方式举例

    java中对象和Map互相转换的几种常见方式举例

    Map在日常开发应用中的频率很高,最常用的实现类是HashMap和有序的TreeMap,下面这篇文章主要给大家介绍了关于java中对象和Map互相转换的几种常见方式举例,需要的朋友可以参考下
    2024-01-01
  • springboot+nacos+gateway实现灰度发布的实例详解

    springboot+nacos+gateway实现灰度发布的实例详解

    灰度发布是一种在软件部署过程中用于平滑过渡的技术,通过引入灰度发布SDK和配置网关策略实现,本文就来介绍一下,感兴趣的可以了解一下
    2022-03-03
  • 深入了解java中常见的五种比较方法

    深入了解java中常见的五种比较方法

    在程序的世界里面,比较也是必不可少的,通过比较可以确定对象的相对顺序、相等性以及其他比较条件,下面我们就来深入了解一下java中常见的五种比较方法吧
    2023-12-12
  • SpringBoot中@EnableAutoConfiguration注解的实现

    SpringBoot中@EnableAutoConfiguration注解的实现

    Spring Boot@EnableAutoConfiguration是一个强大的工具,可以简化配置过程,从而实现快速开发,本文主要介绍了SpringBoot中@EnableAutoConfiguration注解的实现,感兴趣的可以了解一下
    2024-01-01
  • SpringBoot中@Scheduled()注解以及cron表达式详解

    SpringBoot中@Scheduled()注解以及cron表达式详解

    这篇文章主要介绍了SpringBoot中@Scheduled()注解以及cron表达式详解,@Scheduled注解是Spring Boot提供的用于定时任务控制的注解,主要用于控制任务在某个指定时间执行,或者每隔一段时间执行,需要的朋友可以参考下
    2023-08-08
  • Java设计模式之抽象工厂模式

    Java设计模式之抽象工厂模式

    这篇文章主要为大家详细介绍了Java设计模式之抽象工厂模式的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • Java中的常用输入输出语句的操作代码

    Java中的常用输入输出语句的操作代码

    这篇文章主要介绍了Java中的常用输入输出语句的操作代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • 手把手教你如何用JAVA连接MYSQL(mysql-connector-j-8.0.32.jar)

    手把手教你如何用JAVA连接MYSQL(mysql-connector-j-8.0.32.jar)

    这篇文章主要介绍了关于如何用JAVA连接MYSQL(mysql-connector-j-8.0.32.jar)的相关资料,文中通过图文介绍的非常详细,对大家学习或者使用MySQL具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-01-01

最新评论