티스토리 뷰
자바는 예외가 발생하면 예외 클래스로부터 객체를 생성한다.
자바의 모든 에러와 예외 클래스는 Throwable을 상속받아 만들어지고, 예외 클래스는 java.lang.Exception 클래스를 상속받는다.

큰 그림부터 잡아보자.
🔵 Throwable
- Error
- Exception
여기서, Error는 컴퓨터 하드웨어의 고장으로 인해 응용프로그램 실행 오류가 발생하는 것(즉, 프로그램이 잘못된 것이 나닌, 환경 자체가 망가진 상황)으로,
프로그램을 아무리 견고하게 만들어도 개발자는 이런 에러에 대처할 방법이 전혀없다.
즉, 우리가 처리하고자하는 건 Exception(예외)이다.
그럼 이제 이 Exception에 대해서 또 자세히 알아보자.
위에서 Exception은 아래와 같이 또 나뉘어진다.
🟣 Exception
- Runtime Exception (Unchecked)
- Other Exceptions (Checked)
하나하나씩 살펴보자.
🟩 Checked Exception
Checked Exception은 Exception 중 RuntimeException이 아닌 것들이 해당한다.
아래는 Checked Exception의 예시이다.
- FileNotFoundException (파일을 찾을 수 없음)
- SQLException (데이터 베이스 접근 오류)
- ClassNotFoundException (클래스 파일을 찾지 못했을 경우)
등등등...
Checked Exception은 하나의 특징을 가지고 있다.
컴파일러가 강제로 처리하게(try-catch문 사용) 만든다는 것이다.

이렇게 빨간줄로 말이다.
하지만, 그렇다고 컴파일단계에서 발생한다는 의미가 아니다.
실행하기 전에 빨간줄을 통해서 try-catch문을 사용하도록한다는 의미이지, 컴파일과정에서 발생하는 예외가 아닌, 런타임 과정에서 발생하는 예외이다. (즉, try-catch문을 사용하지않더라도 실행은 가능하다. 물론 바로 예외가 터진다. 그래서 강제한다고 표현한것이다.)
🟩 Unchecked Exception
RuntimeException 및 RuntimeException의 자식 예외 클래스들을 말한다.
아래는 Unchecked Exception의 예시들이다.
NullPointerException (null 객체 접근)
IllegalArgumentException (잘못된 인자 전달)
ArrayIndexOutOfBoundsException (배열 인덱스 초과)
Unchecked Exception은 Checked Exception과 반대되는 특징을 가지고 있다.
컴파일러가 강제로 try-catch문을 이용하도록 하지 않는다는 것이다.
즉, ⭐️⭐️ 최종적으로 자바의 예외 구조는 아래와 같이 생겼다. ⭐️⭐️
🔵 Throwable
- Error
- 🟣 Exception
- RuntimeException (Unchecked Exception)
- Other Exceptions (Checked Exception)
🟩 Checked Exception과 Unchecked Exception의 차이
위에서 Checked Exception과 Unchecked Exception의 특징을 각각 말했을 때, 좀 헷갈렸을 것이다.
일단 눈에 보기 쉽게 정리해보겠다.
🟣 Checked Exception 은 try-catch문을 강제로 사용해야하고,
🟣 Unchecked Exception 은 try-catch문을 사용하지 않아도 되도록 만들 수 있다(=try-catch문을 강제하지 않는다).
이 차이에 대한 추가적인 설명은 아래 블로그에 정리해놓았다.
https://kodong8774.tistory.com/112
자바 - Checked Exception과 Unchecked Exception 에 대한 오해
자바 - Exception - Checked, Unchecked 각각 의미 다시 제대로 정리하기 자바 - Exception - Checked, Unchecked 각각 의미 다시 제대로 정리하기자바에서의 런타입 오류(예외, 에러) 중 하나인 예외에 대해서 좀
kodong8774.tistory.com
※ 이번 블로그에서는 기본적인 try-catch-finally 구문을 설명하지는 않는다. 내가 헷갈리거나 모르는 부분만 정리한다.
※ 혹시나 기본 try-catch-finally 구문에 대해서 궁금하다면 아래 블로그를 참고하자.
※ https://kodong8774.tistory.com/45
자바 - try-catch-finally 구문, switch 구문 간단한 예제
이번에도 자바 문법 포스팅이다. 자바 문법도 기본적인 레벨은 어느정도 많이 익혔다고 생각을 한다. 현재 만들고 있는 계산기 프로그램에서 예외를 처리해야하는 일이 생겨 예외처리 구문인 tr
kodong8774.tistory.com
🟩 예외 종류에 따른 처리
try 블록에는 다양하나 종류의 예외가 발생할 수 있다.
이 경우 다중 catch를 사용하면 발생하는 예외에 따라 예외 처리 코드를 다르게 작성할 수 있다.
catch 블록이 여러 개라 할지라도 catch 블록은 단 하나만 실행 된다.
그 이유는 try 블로그에서 동시다발적으로 예외가 발생하지 않으며, 하나의 예외가 발생하면 즉시 실행을 멈추고 해당 catch 블록으로 이동하기 때문이다.
(굳이 예제는 넣지 않겠다.)
또 처리해야할 예외 클래스들이 상속 관계에 있을 때는 하위 클래스 catch 블록을 먼저 작성하고 상위 클래스 catch 블록을 나중에 작성해야한다.
왜냐하면, 예외가 발생하면 catch 블록은 위에서부터 차례대로 검사 대상이 되는데,
하위 예외도 상위 클래스 타입이므로 상위 클래스 catch블록이 먼저 검사 대상이 되면 안된다.
아래는 그 예시이다.
try {
// ArrayIndexOfBoundException 발생!
// NumberFormatException 발생!
} catch(Exception e) {
// (예외처리)
} catch(ArrayIndexOfBoundsException e) {
// (예외처리)
}
ArrayIndexOfBoundExecption이 try블록에서 발생했으면, ArrayIndexOfBoundExecption을 잡는 catch블록이 실행되어야하는데, 그렇지 않고 Exception을 잡는 catch블록이 실행된다 ❌❌❌!!
또, 두 개 이상의 예외를 하나의 catch 블록으로 동일하게 예외 처리하고 싶을 경우,
catch 블록에 예외 클래스를 기호 "|"로 연결하면 된다.
아래는 간단한 예시이다.
try {
// ...
} catch(NullPointerException | NumberFormatException e) {
// (예외 처리)
}
🟩 예외 떠넘기기 (throws 키워드)
메소드 내부에서 예외가 발생할 때, try-catch 블록으로 예외를 처리하는 것이 기본이지만,
메소드를 호출한 곳으로 예외를 떠넘길 수도 있다.
바로 throws 키워드를 사용하면 된다.
throws 키워드는 메소드 선언부 끝에 작성하는데, 떠넘길 예외 클래스를 쉽표로 구분해서 나열해주면 된다.
아래는 간단한 예제이다.
class Tmp {
public void method1() {
try {
method2();
} catch (ClassNotFoundException e) {
System.out.println("예외 처리: " + e.getMessage());
}
}
public void method2() throws ClassNotFoundException {
Class.forName("java.lang.String2");
}
}
class Main {
public static void main(String[] args) {
A a = new A();
a.method1();
}
}
만약 나열해야할 예외 클래스가 많은 경우에는 throws Exception 또는 throws Throwable만으로 모든 예외를 간단히 떠넘길 수도 있다.
+)
main() 메소드에서도 throws 키워드를 사용해서 예외를 떠넘길 수 있는데,
결국 JVM이 최종적으로 예외 처리를 하게된다.
JVM은 예외의 내용을 콘솔에 출력하는 것으로 에외 처리를 한다.
public static void main(String[] args) throws Exception {
}
'Java' 카테고리의 다른 글
| 자바 - I/O (Input and Output, 데이터 입출력) (0) | 2026.03.24 |
|---|---|
| 자바 - 커스텀 예외(사용자 정의 예외), 예외 발생시키기(throw 키워드) (0) | 2026.03.19 |
| 자바 - (추후 내용 추가 및 수정 하자!) 중첩 선언과 익명 객체 (중첩 클래스, 중첩 인터페이스, 익명 객체) (0) | 2026.03.15 |
| 자바 - 인터페이스 ( 상수 필드, 추상 메서드, 디폴트 메서드, 정적 메서드, private 메서드, 다중 인터페이스 ) (0) | 2026.03.09 |
| 자바 - 상속 ( 클래스 상속, 메서드 오버라이딩, super, final 클래스 및 메서드의 상속, 자동/강제 타입 변환, 다형성, instanceof, 추상 클래스 ) (0) | 2026.03.08 |