Java 예외 처리 — 일반 예외와 실행 예외를 가르는 기준
이 글은 2022년 5월 기준 기록입니다.
프로그램이 멈추는 상황을 뭉뚱그려 "에러"라고 부르지만, Java에서 에러(Error)와 예외(Exception)는 다른 것입니다. 이 구분이 예외 처리의 출발점입니다.
에러는 손쓸 수 없고 예외는 손쓸 수 있습니다
에러는 하드웨어의 잘못된 동작 또는 고장으로 인한 오류입니다. 에러가 발생하면 프로그램이 종료됩니다.
예외는 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인한 오류입니다. 예외 역시 발생하면 프로그램이 종료되지만, 결정적인 차이가 하나 있습니다. 예외는 예외 처리를 통해 정상 실행 상태를 유지할 수 있습니다. 예외 처리라는 기법이 존재하는 이유가 여기에 있습니다.
컴파일러가 강제하느냐가 예외의 종류를 가릅니다
예외는 다시 일반 예외와 실행 예외로 나뉩니다.
일반 예외(Compile Exception)는 예외 처리 구문이 없으면 컴파일 시 오류가 발생하는 예외입니다. 클래스가 없거나 파일이 없는 경우처럼 프로그램 외적인 부분의 영향으로 오류가 발생할 수 있는 지점에 대해, 컴파일러가 예외 처리가 필요함을 미리 알려 주는 것입니다.
실행 예외(Runtime Exception)는 개발자의 코딩에 따라 예외가 발생할 수도 있고 아닐 수도 있는 경우입니다. 컴파일은 정상적으로 가능합니다.
둘을 갈라 보는 가장 확실한 방법은 상속 구조입니다.

java.lang.Exception을 최상위에 두고, ClassNotFoundException·InterruptedException 같은 것들이 일반(컴파일러 체크) 예외로 자리합니다. 그 옆에 java.lang.RuntimeException이 있고, 그 아래에 NullPointerException·NumberFormatException 같은 실행 예외들이 붙습니다. 즉 RuntimeException의 자손이면 실행 예외이고, 그 밖의 Exception 자손이면 일반 예외입니다.
try-catch-finally는 예외 발생 여부와 무관한 길을 남깁니다
예외 처리 코드의 기본 형태는 try - catch - finally입니다.

정상 실행된 경우와 예외가 발생한 경우의 흐름이 다릅니다. 정상 실행되면 try 블록의 코드가 끝까지 수행된 뒤 catch 블록을 건너뛰고 finally로 넘어갑니다. try 블록 중간에서 예외가 발생하면 그 지점에서 실행이 끊기고 곧바로 catch 블록으로 넘어가 예외를 처리한 뒤, 역시 finally로 이어집니다. 어느 경로를 타든 finally에 적힌 코드는 항상 실행됩니다.
catch 문에서는 발생한 예외에 대한 정보를 담고 있는 e를 사용할 수 있습니다.
다중 catch는 하위 예외를 먼저 적어야 동작합니다
필요한 경우 다중 catch 문을 이용해 다양한 예외를 처리할 수 있습니다. 또 하나의 catch 문 안에서 |(파이프)를 통해 여러 예외를 한꺼번에 처리하는 것도 가능합니다.
다중 catch 문을 사용할 때 지켜야 할 순서 규칙이 있습니다. 하위 예외가 먼저, 즉 위쪽에서 처리되어야 합니다. 상위 예외를 위에 두면 하위 예외까지 그쪽에서 다 걸러지므로 아래 catch가 의미를 잃습니다.
throws는 처리 책임을 호출한 쪽으로 넘깁니다
모든 예외를 발생 지점에서 처리해야 하는 것은 아닙니다. throws는 예외 처리를 해당 코드에서 직접 하지 않고, 해당 코드를 호출(실행)하는 부분에서 하도록 떠넘기는 것입니다.
예외를 어디서 처리할지는 결국 설계의 문제이고, throws는 그 결정을 미룰 수 있게 해 주는 장치입니다.
'IT·테크 > 개발' 카테고리의 다른 글
| Java JDBC — 드라이버 로드부터 Statement·PreparedStatement·ResultSet까지 (0) | 2026.07.28 |
|---|---|
| Java 컬렉션 프레임워크 — List·Set·Map의 갈래와 Comparable·Comparator (0) | 2026.07.28 |
| Java Wrapper 클래스 — 기본 타입을 객체로 다루는 박싱과 언박싱 (0) | 2026.07.26 |
| Java 제네릭(Generic) — 캐스팅을 없애고 타입 검사를 컴파일 단계로 옮기기 (0) | 2026.07.25 |
| 자바 클래스 정리 — 필드·생성자·메소드부터 어노테이션까지 (0) | 2026.07.24 |