Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

วิธีแก้ปัญหา IllegalArgumentException ใน Java ได้อย่างไร


An IllegalArgumentException ถูกส่งออกไปเพื่อระบุว่าวิธีการได้ผ่านการโต้แย้งที่ผิดกฎหมาย ข้อยกเว้นนี้ขยาย RuntimeException คลาสและดังนั้นจึงเป็นข้อยกเว้นที่สามารถส่งออกได้ระหว่างการทำงานของ Java Virtual Machine (JVM) เป็นข้อยกเว้นที่ไม่ได้ตรวจสอบ ดังนั้นจึงไม่จำเป็นต้องประกาศในเมธอดหรือคำสั่งโยนของตัวสร้าง

สาเหตุของ java.lang.IllegalArgumentException

  • เมื่ออาร์กิวเมนต์อยู่นอกขอบเขต ตัวอย่างเช่น เปอร์เซ็นต์ควรอยู่ระหว่าง 1 ถึง 100 หากผู้ใช้ป้อน 101 แล้ว IllegalArugmentExcpetion จะถูกโยนทิ้ง
  • เมื่อรูปแบบอาร์กิวเมนต์ไม่ถูกต้อง ตัวอย่างเช่น หากวิธีการของเราต้องการรูปแบบวันที่ เช่น YYYY/MM/DD แต่ถ้าผู้ใช้ส่งผ่าน YYYY-MM-DD ถ้าอย่างนั้นวิธีการของเราก็ไม่เข้าใจ IllegalArugmentExcpetion จะถูกโยนทิ้ง
  • เมื่อเมธอดต้องการสตริงที่ไม่ว่างเป็นพารามิเตอร์แต่ส่งผ่านสตริงว่าง

ตัวอย่าง1

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:15)

ขั้นตอนในการแก้ปัญหา IllegalArgumentException

  • เมื่อ IllegalArgumentException ถูกส่งออกไป เราต้องตรวจสอบ call stack ใน Java's stack trace และค้นหาวิธีที่สร้างอาร์กิวเมนต์ที่ไม่ถูกต้อง
  • The IllegalArgumentException มีประโยชน์มากและสามารถใช้เพื่อหลีกเลี่ยงสถานการณ์ที่โค้ดของแอปพลิเคชันจะต้องจัดการกับข้อมูลอินพุตที่ไม่ได้ตรวจสอบ
  • การใช้งานหลักของ IllegalArgumentException . นี้ ใช้สำหรับตรวจสอบอินพุตที่มาจากผู้ใช้รายอื่น
  • ถ้าเราต้องการจับ IllegalArgumentException จากนั้นเราก็สามารถใช้บล็อก try-catch ได้ การทำเช่นนี้เราสามารถจัดการกับบางสถานการณ์ได้ สมมติว่าใน catch block หากเราใส่โค้ดเพื่อให้ผู้ใช้มีโอกาสป้อนข้อมูลอีกครั้งแทนการหยุดการทำงานโดยเฉพาะในกรณีที่มีการวนซ้ำ

ตัวอย่าง2

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: