Java에서 IllegalArgumentException은 메서드에 허용되지 않는(잘못된) 인자가 전달될 때 발생하는 런타임 예외입니다. 다행히 이런 예외를 유발할 수 있는 메서드들은 대부분 어떤 값이 유효한지 미리 알고 있기 때문에, 메서드를 호출하기 전에 if 조건문으로 인자 값을 검증하면 예외 자체를 효과적으로 피할 수 있습니다.
if 문을 활용한 인자 값 검증
if 문을 사용하면 메서드가 받을 수 있는 인자 값의 범위를 제한할 수 있습니다. 예를 들어, 특정 메서드가 일정 범위의 값만 허용한다면, 실제로 메서드를 실행하기 전에 if 문으로 해당 값이 유효한 범위 내에 있는지 확인하는 것이 좋습니다.
이러한 사전 검증 방식은 두 가지 장점이 있습니다. 첫째, 프로그램이 비정상적으로 종료되는 것을 막을 수 있고, 둘째, 사용자에게 왜 입력값이 거부되었는지 명확한 안내 메시지를 제공할 수 있습니다.
예제 코드
다음 예제는 스레드의 우선순위를 설정하는 setPriority() 메서드에서 발생할 수 있는 IllegalArgumentException을 if 문으로 미리 검증하여 처리합니다. Java에서 스레드 우선순위는 Thread.MIN_PRIORITY(1)부터 Thread.MAX_PRIORITY(10) 사이의 값만 가질 수 있습니다.
import java.util.Scanner;
public class IllegalArgumentExample {
public static void main(String args[]) {
Thread thread = new Thread();
System.out.println("스레드 우선순위 값을 입력하세요: ");
Scanner sc = new Scanner(System.in);
int priority = sc.nextInt();
if(priority <= Thread.MAX_PRIORITY) {
thread.setPriority(priority);
} else {
System.out.println("우선순위 값은 다음보다 작아야 합니다: " + Thread.MAX_PRIORITY);
}
}
}실행 결과
스레드 우선순위 값을 입력하세요: 15 우선순위 값은 다음보다 작아야 합니다: 10
코드 설명
사용자가 콘솔에 15라는 값을 입력하면, 이 값은 최대 우선순위인 10보다 크기 때문에 if 조건문의 검증에 걸려 setPriority() 메서드가 호출되지 않습니다. 대신 프로그램은 적절한 경고 메시지를 출력하고 정상적으로 종료됩니다. 만약 이 검증 과정이 없었다면 JVM은 IllegalArgumentException을 던지며 프로그램이 비정상적으로 중단되었을 것입니다.
추가 팁
더 견고한 코드를 원한다면 다음 사항도 고려해 보세요.
- 범위의 양 끝도 검증: 위 예제는 상한만 확인하므로, 필요하다면 하한(
Thread.MIN_PRIORITY)도 함께 검사하여 음수나 0 같은 잘못된 값도 걸러내는 것이 좋습니다. - 예외 처리 병행: try-catch 블록으로 IllegalArgumentException을 잡아 처리하는 방법도 있지만, 가능한 한 사전 검증으로 예외 발생 자체를 막는 것이 더 깔끔한 설계 방식입니다.
- 직접 작성한 메서드의 경우: 파라미터가 유효하지 않을 때 의도적으로 IllegalArgumentException을 던져 호출자에게 문제를 명확히 알리는 패턴도 널리 사용됩니다.