Effective Java | #69. 예외는 진짜 예외 상황에만 사용하라

보람·2022년 5월 14일
0

Effective-Java

목록 보기
23/25
//배열 마지막 크기까지 값 넣는 코드 
try { 
	int i = 0;
    while(true)
    	range[i++].climb();
} catch(ArrayIndexOutOfBoundsException e) {
	//배열 마지막 크기에 도달하면 코드 종료 
}

위 코드를 사용하지 말아야 하는 이유

  • 직관적이지 않다는 이유로 이런 코드를 사용하지 않아야 하는 이유는 이미 생겼다(item-67)
  • 또한 해당 코드는 무한루프를 돌다가 배열 끝에 도달해야만 예외가 발생되어 끝이 나는 슬픈 코드다.
  • 코드를 try-catch 블록 안에 넣으면(예외처리하면) JVM이 적용할 수 있는 최적화가 제한
  • 심지어는 제대로 동작되지 않을 수도 있다
    • 반복문 내부에 버그가 숨어 있다면 디버깅을 훨씬 어렵게 할 것이고 호출 메서드 내부에서 사용하는 배열에서 ArrayIndexOutOfBoundsException 가 일어났다면 엉뚱한 예외임에도 반복문 정상 종료 상황으로 오해하고 넘어갈 수도 있다.

예외는 오직 예외 상황에서만 쓰자.

  • 일상적인 제어 흐름용으로 쓰여선 안된다.

정상적인 제어 흐름에서 예외를 사용하지 않도록 하자

몇 가지 방법이 있다.

상태의존적메서드❤️상태검사메서드

  • 상태의존적메서드 : 특정 상태일때만 실행 가능한 메서드 (next())
  • 상태검사메서드 : 상태의존적메서드를 사용가능한지 여부 판단 메서드(hasNext())
  • 이 둘을 꼭 함께 사용하기
  • 가독성이 옵셔널보다 더 좋고 잘못 사용했을 때 발견하기가 쉬움, 비동기이거나 상태의존적메서드 중복 사용이 아니라면 이 둘을 같이 사용하는 것이 더 좋다.

빈 옵셔널(item-55) or null 같은 특수한 값 반환

  • 올바르지 않은 상태일 때 사용 가능
  • 비동기화 혹은 외부 요인으로 상태가 변경된다면 사용할 것
  • 성능이 중요한 상황에서 상태 검사 메서드가 상태 의존적 메서드의 작업 일부를 중복 수행한다면 대신 사용할 것

예외는 말 그대로 예외이다.
정상적인 제어 흐름에서 사용하지 말고 진짜 예외 상황에만 사용하자!

profile
백엔드 개발자

0개의 댓글