예외는 자바에서 오류 처리를 위한 메커니즘입니다. 던져지는 객체는 모두 Throwable의 파생 클래스입니다. 두 가지 주요 범주가 있습니다:
Exception의 자식 클래스, RuntimeException 제외): 명시적으로 처리하거나 throws를 통해 메소드 시그니처에 선언해야 합니다.RuntimeException의 자식 클래스): 명시적으로 처리할 필요가 없으며, 어떤 위치에서도 발생할 수 있습니다 (예: NullPointerException).언제 사용해야 하나요?
public void readFile(String path) throws IOException { // 체크된 예외 — 처리가 필요합니다 Files.readAllLines(Paths.get(path)); } public void divide(int a, int b) { int c = a / b; // 언체크 — ArithmeticException }
throws를 선언하지 않은 메소드가 체크된 예외를 던질 수 있나요?
답변: 아니요, 컴파일러는 메소드 시그니처에 선언 없이 체크된 예외를 던지는 것을 허용하지 않습니다 (throws). 하지만 언체크 예외는 어떤 경고 없이 던질 수 있습니다.
void foo() { throw new IOException(); // 컴파일 오류 }
이야기
인터넷 뱅크에서 고객이
SQLExceptions처리 대신 언체크 래퍼를 사용하기로 결정했습니다. 이로 인해 드라이버를 업데이트할 때 보이지 않는 오류로 데이터가 비동기화되었습니다.
이야기
로깅 애플리케이션에서 로그 파일이 체크된 예외(
FileNotFoundException)를 처리하지 못해 잠겨있게 되었고, 이 오류는 호출 체인에서 "잃어버린" 상태로 제때 처리되지 않아 애플리케이션이 더 이상 로그에 쓸 수 없었습니다.
이야기
거래 플랫폼 팀이 "절대 충돌하지 않도록" catch(Throwable)를 글로벌하게 구현하였습니다. 결과적으로 중요 언체크 예외가 감춰져 애플리케이션이 불일치 상태에서 계속 실행되었고, 복잡한 버그와 데이터 손실을 초래했습니다.