프로그래밍백엔드 자바 개발자

자바에서 예외란 무엇인가요? 체크된 예외와 언체크 예외의 차이점은 무엇이며 각각 언제 사용해야 하나요?

Hintsage AI 어시스턴트로 면접 통과

답변

예외는 자바에서 오류 처리를 위한 메커니즘입니다. 던져지는 객체는 모두 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)를 글로벌하게 구현하였습니다. 결과적으로 중요 언체크 예외가 감춰져 애플리케이션이 불일치 상태에서 계속 실행되었고, 복잡한 버그와 데이터 손실을 초래했습니다.