当前位置: 首页 > article >正文

如何解决 Java 中的 IllegalArgumentException 异常?

非法参数异常(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:

http://www.kler.cn/a/148650.html

相关文章:

  • docker:docker: Get https://registry-1.docker.io/v2/: net/http: request canceled
  • 继承和多态(上)
  • 九州未来再度入选2024边缘计算TOP100
  • MyBatisPlus 用法详解
  • 物理设备命名规则(Linux网络服务器 15)
  • 在Flutter中,禁止侧滑的方法
  • Windows10系统卸载服务和删除服务
  • 使用STM32 HAL库驱动光电传感器的设计和优化
  • Python算法——Merkle树
  • 09-详解JSR303规范及其对应的校验框架的使用
  • Python与设计模式--中介者模式
  • 国家对于新消费新经济有哪些新旨意?
  • VScode集成python开发环境和基本插件下载配置
  • 【沐风老师】3DMAX拼图建模工具MaxPuzzle2D插件使用方法详解
  • 视频字幕处理+AI绘画,Runway 全功能超详细使用教程(4)
  • 学习MySQL先有全局观,细说其发展历程及特点
  • 学习笔记-瑞吉外卖项目实战(一)
  • 食谱菜谱大全API接口
  • 设计模式——RBAC 模型详解
  • 11.28
  • Scrapy爬虫异步框架之持久化存储(一篇文章齐全)
  • 在awk中 sub函数 和 gsub函数 的区别
  • Docker 运行 Oracle Autonomous Database Free Container
  • Android虚拟化
  • [机缘参悟-120] :计算机世界与佛家看世界惊人的相似
  • 数据提取PDF SDK的对比推荐