✅ java.lang.IllegalArgumentException
Exception in thread "main" java.lang.IllegalArgumentException: Width must be greater than zero at com.example.ImageResizer.resize(ImageResizer.java:42)
🔍 자주 발생하는 케이스
1. 유효하지 않은 값이 들어왔을 때
public void setAge(int age) {
if (age < 0) {
throw new IllegalArgumentException("나이는 음수가 될 수 없습니다.");
}
}
- 메서드에 유효하지 않은 값이 전달되었을 때 사용자가 명시적으로 던짐
2. 외부 라이브러리 내부에서 발생
Files.readString(Path.of("")); // IllegalArgumentException
- 비어있는 경로나 null 값을 넘길 경우 라이브러리 내부에서 예외 발생
- 명시적으로 던지지 않았는데 예외가 터지는 경우
- 대부분 라이브러리 내부에서 매개변수 유효성 검사 실패
3. 정규식 관련 유효하지 않은 인자
Pattern.compile("[a-z"); // PatternSyntaxException → IllegalArgumentException 하위
- 표면상 다른 예외처럼 보여도 내부적으로는 IllegalArgumentException이 루트
4. 스프링 API 사용 중 자주 만남
java.lang.IllegalArgumentException: Required request parameter 'id' is not present
@PostMapping("/users")
public ResponseEntity<?> createUser(@Valid @RequestBody UserDto dto) {
// 유효성 실패 시 예외 발생
}
- @RequestParam(required = true) 인데 값이 누락된 경우
- @Valid + @RequestBody 조합으로 요청을 검증할 때, BindingResult 없이 컨트롤러에 전달되면 내부적으로 IllegalArgumentException 발생
- 특히 테스트 환경에서 @Valid의 예외가 MethodArgumentNotValidException으로 감싸지지 않고 내부적으로 IllegalArgumentException로 보이는 경우도 있음
🛠️ 해결 방법
1. 사전에 인자 유효성 검증
if (StringUtils.hasText(name)) {
throw new IllegalArgumentException("이름은 필수 입력값입니다.");
}
2. Objects.requireNonNull() 사용
Objects.requireNonNull(email, "email은 null일 수 없습니다.");
- null 검사를 간결하게 처리 가능
3. 외부 라이브러리에서 발생하는 경우, 매개변수 문서 확인
- 라이브러리 API에서 어떤 값이 유효한지 문서 확인 필요
- ex: Spring에서 @RequestParam(required = true)인데 값이 누락되면 400 오류와 함께 해당 예외 발생 가능
📌 정리
- IllegalArgumentException은 "메서드 호출이 잘못됐다"는 런타임 예외
- 대부분은 개발자가 직접 throw new IllegalArgumentException(...)을 명시적으로 사용함
- 예외를 직접 던지는 경우엔 예외 메시지에 검증 조건을 명확히 적는 게 중요
- 예외 발생 시점이 애매하면 메서드 호출 흐름을 점검하는 게 빠름
'DevLog > Java' 카테고리의 다른 글
IllegalStateException - 지금 상태에서 호출하면 안 되는 메서드 (0) | 2025.05.18 |
---|---|
java.util.ConcurrentModificationException - 반복문에서 리스트 수정하면 생기는 문제 (0) | 2025.05.18 |
java.lang.NullPointerException - 왜 null인지 모를 때 (0) | 2025.05.18 |
MySQL 오류: Illegal mix of collations for operation 'like' (0) | 2025.05.01 |
Gradle 의존성 정리 (0) | 2025.04.25 |