Back-End/Java

13. 예외 처리(Exception Handling)

Yerin Thea Yoo 2026. 2. 12. 00:46

프로그램은 항상 정상적으로만 동작하지 않는다.

파일이 없을 수도 있고, 입력 값이 잘못될 수도 있으며, 네트워크 연결이 끊길 수도 있다.

 

이처럼 프로그램 실행 중 발생하는 오류 상황을 예외(Exception)라고 한다.

Java는 예외를 클래스 형태로 관리한다.

 

1. 예외와 오류의 차이

Java의 최상위 클래스는 Throwable이다.

Throwable
 ├── Error
 └── Exception

 

1) Error

  • 시스템 레벨 오류
  • 복구 불가
  • 개발자가 처리하지 않음

ex. OutOfMemoryError

 

2) Exception

  • 프로그램 실행 중 발생 가능
  • 개발자가 처리 가능
  • 우리가 다루는 대상

 

2. 체크 예외 vs. 언체크 예외

Exception은 두 종류로 나뉜다.

1) 체크 예외(Checked Exception)

  • 컴파일 단계에서 확인
  • 반드시 처리해야 함

ex.

  • IOException
  • SQLException

 

2) 언체크 예외(Unchecked Exception)

  • RuntimeException 하위 클래스
  • 컴파일 시 강제하지 않음

ex.

  • NullPointerException
  • ArrayIndexOutOfBoundsException
  • IllegalArgumentException

 

3. try-catch문

예외를 직접 처리하는 구조

try {
	int result = 10 / 0;
} catch (ArithmeticException e) {
	System.out.printIn("0으로 나눌 수 없음");
}

동작

  • try 블록 실행
  • 예외 발생 시 catch로 이동
  • 해당 타입과 일치하는 catch 실행

 

4. finally

항상 실행되는 블록

try {
	// 실행
} catch (Exception e) {
	//예외 처리
} finally {
	//항상 실행
}

주로

  • 자원 해제
  • 파일 닫기
  • DB 연결 종료

 

5. throws

예외를 직접 처리하지 않고 호출한 곳으로 넘긴다.

void readFile() throws IOException{
	// 파일 처리
}

예외 책임을 상위 호출자에게 위임한다.

 

6. throw

직접 예외를 발생시킨다.

if (age < 0) {
	throw new IllegalArgumentException("나이는 음수 불가");
}

 

7. 사용자 정의 예외

필요에 따라 직접 예외 클래스를 만들 수 있다.

class InvalidAgeException extends Exception {
    public InvalidAgeException(String message) {
        super(message);
    }
}

사용

throw new InvalidAgeException("잘못된 나이");

 

8. try-with-resources

Java 7부터 도입된 자원 자동 해제 문법

try (BufferedReader br = new BufferedReader(new FileReader("a.txt"))) {
    // 사용
}

AutoCloseable 구현 객체는 자동으로 close() 호출된다.

 

9. 예외 처리 전략

실무에서 중요한 것은 "어디서 처리할 것인가"이다.

1) 낮은 레벨

  • 예외를 throws로 던짐

2) 상위 레벨

  • 공통 처리(로깅, 사용자 메세지)

3) RuntimeException 활용

  • 비즈니스 로직 예외는 언체크 예외로 처리하는 경우 많음