IllegalArgumentException vs IllegalStateException

June·2022년 2월 19일
9

우테코

목록 보기
12/84
post-thumbnail

학습 동기

    private Car getMaxPositionCar() {
        return cars.stream()
                .max(Car::compareTo)
                .orElseThrow(() -> new IllegalArgumentException("차량이 존재하지 않습니다"));
       ...
    }

IllegalArgumentException은 어떨 때 사용하는 예외일까요?

프리코스 과정에서는 IllegalArgumentException을 반환하라고 했었다. 그래서 습관적으로 예외를 반환해야 하는 상황에서는 IllegalArgumentException을 썼다. 새삼 정말 많은 종류의 exception이 있다는 것이 생각났다.

부정한 인수, 또는 부적절한 인수를 메서드에 건네준 것을 나타내기 위해서 발생 됩니다. 여기서는 인수를 전달해준 적이 없기 때문에 적절하지 않겠네요.

뭐가 좋을까 찾아봤더니 RuntimeException은 시스템 환경적으로나 인풋 값이 잘못된 경우, 혹은 의도적으로 프로그래머가 잡아내기 위한 조건등에 부합할 때 발생되게 만든다이므로, RuntimeException으로 수정하였습니다.

RuntimeException 잘 사용해주셨습니다. 이번에는 이 정도로 충분해보여요.
아래는 학습을 위해서 코멘트를 남깁니다.
대표적으로 많이 사용하는 예외에는 IllegalArgumentExceptionIllegalStateException이 있어요.
두 예외의 차이점을 한 번 공부해보시면 좋을 거 같아요.

IllegalArgumentException

RuntimeExcpetion을 상속받았다. 즉, unchecked exception이고 처리를 해주지 않아도 컴파일에는 문제가 없다.

부정한 인수, 또는 부적절한 인수를 메서드에 건네준 것을 나타내기 위해서 발생 됩니다. 예를 들어 양수를 넣어줘야 하는데 음수를 넣은 경우. 하지만 위의 예제 코드에서는 어떠한 인수를 전달해준 적이 없기 때문에 적절하지 않은 예외다.

CarName 길이가 최대 5글자인데 10글자짜리를 입력했다면 그때는 IllegalArgumentException을 반환해줘도 될 것이다.

IllegalStatementException

마찬가지로 RuntimeExcpetion을 상속받았다.

부정 또는 부적절한 때에 메서드가 불려 간 것을 나타냅니다. 즉, Java 환경 또는 Java 어플리케이션은 요구된 오퍼레이션에 적절한 상태가 아닙니다. 만약 위의 예제 코드처럼 maxPositionCar를 찾아야하는데 결과값이 없다면 부적절한 때 메서드가 호출된 것이다. 그래서 IllegalStatementException을 반환하는 것이 더 맞다.

참고

0개의 댓글