private Car getMaxPositionCar() {
return cars.stream()
.max(Car::compareTo)
.orElseThrow(() -> new IllegalArgumentException("차량이 존재하지 않습니다"));
...
}
IllegalArgumentException
은 어떨 때 사용하는 예외일까요?
프리코스 과정에서는 IllegalArgumentException
을 반환하라고 했었다. 그래서 습관적으로 예외를 반환해야 하는 상황에서는 IllegalArgumentException
을 썼다. 새삼 정말 많은 종류의 exception
이 있다는 것이 생각났다.
부정한 인수, 또는 부적절한 인수를 메서드에 건네준 것을 나타내기 위해서 발생 됩니다. 여기서는 인수를 전달해준 적이 없기 때문에 적절하지 않겠네요.
뭐가 좋을까 찾아봤더니
RuntimeException
은 시스템 환경적으로나 인풋 값이 잘못된 경우, 혹은 의도적으로 프로그래머가 잡아내기 위한 조건등에 부합할 때 발생되게 만든다이므로, RuntimeException으로 수정하였습니다.
RuntimeException
잘 사용해주셨습니다. 이번에는 이 정도로 충분해보여요.
아래는 학습을 위해서 코멘트를 남깁니다.
대표적으로 많이 사용하는 예외에는IllegalArgumentException
과IllegalStateException
이 있어요.
두 예외의 차이점을 한 번 공부해보시면 좋을 거 같아요.
RuntimeExcpetion을 상속받았다. 즉, unchecked exception이고 처리를 해주지 않아도 컴파일에는 문제가 없다.
부정한 인수, 또는 부적절한 인수를 메서드에 건네준 것을 나타내기 위해서 발생 됩니다
. 예를 들어 양수를 넣어줘야 하는데 음수를 넣은 경우. 하지만 위의 예제 코드에서는 어떠한 인수를 전달해준 적이 없기 때문에 적절하지 않은 예외다.
Car
의 Name
길이가 최대 5글자인데 10글자짜리를 입력했다면 그때는 IllegalArgumentException
을 반환해줘도 될 것이다.
마찬가지로 RuntimeExcpetion을 상속받았다.
부정 또는 부적절한 때에 메서드가 불려 간 것을 나타냅니다. 즉, Java 환경 또는 Java 어플리케이션은 요구된 오퍼레이션에 적절한 상태가 아닙니다.
만약 위의 예제 코드처럼 maxPositionCar
를 찾아야하는데 결과값이 없다면 부적절한 때 메서드가 호출된 것이다. 그래서 IllegalStatementException
을 반환하는 것이 더 맞다.