Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Cách giải quyết IllegalArgumentException trong Java?


Một IllegalArgumentException được ném để chỉ ra rằng một method đã được truyền một argument không hợp lệ. Exception này extend RuntimeException class và do đó thuộc loại exceptions có thể được ném trong quá trình hoạt động của Java Virtual Machine (JVM). Nó là unchecked exception và do đó không cần khai báo trong throws clause của method hoặc constructor.

Lý do gây java.lang.IllegalArgumentException

  • Khi Arguments out of range. Ví dụ, percentage nên nằm 1 đến 100. Nếu user nhập 101 thì IllegalArugmentExcpetion sẽ được ném.
  • Khi argument format không hợp lệ. Ví dụ, nếu method yêu cầu date format YYYY/MM/DD nhưng user truyền YYYY-MM-DD. Method không hiểu thì IllegalArugmentExcpetion sẽ được ném.
  • Khi method cần non-empty string làm parameter nhưng null string được truyền.

Ví dụ 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); 
    } 
}

Kết quả

45 Exception in thread "main" java.lang.IllegalArgumentException: 101 at Student.setMarks(Student.java:5) at Student.main(Student.java:15)

Các bước giải quyết IllegalArgumentException

  • Khi IllegalArgumentException được ném, chúng ta phải kiểm tra call stack trong Java stack trace và xác định method tạo ra wrong argument.
  • IllegalArgumentException rất hữu ích và có thể dùng để tránh tình huống code ứng dụng phải deal với unchecked input data.
  • Mục đích chính của IllegalArgumentException là validate input từ user khác.
  • Nếu muốn catch IllegalArgumentException thì dùng try-catch blocks. Làm vậy có thể handle một số tình huống. Giả sử trong catch block đặt code cho user nhập lại thay vì dừng execution đặc biệt trong trường hợp looping.

Ví dụ 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); 
            } 
        } 
    } 
}

Kết quả

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: