DevLog/Java

java.lang.IllegalArgumentException - 메서드 호출이 잘못됐다는 신호

archive-log 2025. 5. 18. 13:41

✅ 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(...)을 명시적으로 사용함
  • 예외를 직접 던지는 경우엔 예외 메시지에 검증 조건을 명확히 적는 게 중요
  • 예외 발생 시점이 애매하면 메서드 호출 흐름을 점검하는 게 빠름