IllegalArgumentException 메서드에 잘못된 인수가 전달되었음을 나타내기 위해 throw됩니다. 이 예외는 RuntimeException 을 확장합니다. 클래스이므로 JVM(Java Virtual Machine) 작동 중에 throw될 수 있는 예외에 속합니다. 확인되지 않은 예외이므로 메서드나 생성자의 throw 절에서 선언할 필요가 없습니다.
java.lang.IllegalArgumentException의 원인
- 인수가 범위를 벗어날 때. 예를 들어 백분율은 1에서 100 사이여야 합니다. 사용자가 101을 입력한 경우 IllegalArugmentExcpetion 던져질 것입니다.
- 인수 형식이 잘못된 경우. 예를 들어, 우리 방법에 YYYY/MM/DD와 같은 날짜 형식이 필요하지만 사용자가 YYYY-MM-DD를 전달하는 경우. 그러면 우리의 방법은 IllegalArugmentExcpetion 을 이해할 수 없습니다. 던져질 것입니다.
- 메소드에 비어 있지 않은 문자열이 매개변수로 필요하지만 null 문자열이 전달되는 경우
예시 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 가 발생하면 Java의 스택 추적에서 호출 스택을 확인하고 잘못된 인수를 생성한 메서드를 찾아야 합니다.
- IllegalArgumentException 매우 유용하며 애플리케이션의 코드가 확인되지 않은 입력 데이터를 처리해야 하는 상황을 피하는 데 사용할 수 있습니다.
- 이 IllegalArgumentException 의 주요 용도 다른 사용자의 입력을 확인하기 위한 것입니다.
- IllegalArgumentException 을 포착하려는 경우 그러면 try-catch 블록을 사용할 수 있습니다. 이렇게 하면 몇 가지 상황을 처리할 수 있습니다. 특히 루프의 경우 실행을 중지하는 대신 사용자가 다시 입력할 수 있는 또 다른 기회를 제공하는 코드를 catch 블록에 넣는다고 가정합니다.
예시 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: