본문 바로가기
Java

[JAVA] 예외 처리(Exception Handling)

by teamnova 2025. 4. 17.
728x90

1. 예외(Exception) vs 오류(Error)

프로그래밍을 하다 보면 예외(Exception)오류(Error)라는 단어를 자주 접하게 됩니다. 자바에서 예외(Exception)오류(Error)는 모두 실행 중에 발생하는 문제 상황을 나타냅니다. 하지만, 이 둘은 본질적으로 다릅니다.

(1) 예외(Exception)

  • 정의:
    예외는 프로그램 실행 중에 발생할 수 있는 예상 가능한 문제입니다.
    예를 들어, 파일을 읽으려는데 파일이 없거나, 배열의 잘못된 인덱스에 접근하는 경우가 이에 해당합니다.
  • 특징:
    • 주로 프로그래머의 실수 외부 환경에서 발생합니다.
    • 예외 처리(Exception Handling)를 통해 문제를 복구하거나 적절히 대처할 수 있습니다.
    • 예외는 Exception 클래스를 상속받아 구현됩니다.
  • 예시:
    • NullPointerException (널 참조 접근 시 발생)
    • IOException (파일 입출력 중 오류 발생)
    • SQLException (데이터베이스 작업 중 오류 발생)

(2) 오류(Error)

  • 정의:
    오류는 시스템 자체에서 발생하는 심각한 문제로,프로그램이 정상적으로 실행될 수 없을 때 발생합니다.
  • 특징:
    • 주로 시스템 리소스 부족이나 심각한 JVM 내부 문제로 인해 발생합니다.
    • 일반적으로 복구 불가능하며, 프로그래머가 직접 처리하지 않습니다.
    • 오류는 Error 클래스를 상속받아 구현됩니다.
  • 예시:
    • OutOfMemoryError (메모리 부족)
    • StackOverflowError (스택 메모리 초과)
    • VirtualMachineError (JVM 실행 불가 상황)

2. 자바 예외 계층 구조

자바의 예외 클래스들은 다음과 같은 상속 관계로 계층 구조를 이루고 있습니다

 

(1) Throwable
예외와 오류의 최상위 클래스입니다. 예외와 오류 모두 Throwable을 상속받습니다. 직접 사용할 일은 거의 없고, 예외 처리의 뿌리 역할을 합니다.

 

(2) Error
시스템 레벨의 심각한 문제를 나타냅니다. (예: OutOfMemoryError, VirtualMachineError 등)

일반적으로 Error를 직접 catch해서 처리하지 않습니다. 이런 에러는 복구가 불가능하고, 발생 시 프로그램이 종료되는 것이 일반적입니다.

 

(3) Exception
프로그램에서 "처리해야 하는" 예외로, 개발자가 예외 처리를 통해 복구할 수 있는 문제를 나타냅니다. 이는 다시 두가지로 나뉩니다.

 

1) Checked Exception (검사 예외)

컴파일러가 예외 처리를 강제합니다. 즉, 반드시 try-catch로 잡거나 throws로 던져야 합니다.

외부 시스템이나 파일, 네트워크 등 불확실성이 있는 작업에서 주로 발생합니다.
반드시 예외 처리를 해주어야 하므로, 코드 작성 시 예외 상황을 자연스럽게 고려하게 됩니다.

 

대표 예시:

  • IOException : 입출력 작업 중 오류
  • SQLException : 데이터베이스 작업 중 오류
  • ClassNotFoundException : 클래스를 찾을 수 없음

 

2) Unchecked Exception(비검사 예외)

컴파일러가 예외 처리를 강제하지 않습니다. 대부분 프로그래밍 실수(버그)에서 발생합니다.
예외 처리를 강제하지 않으므로, 필요하다면 catch로 잡아 처리하지만, 근본적으로는 코드 자체에서 이런 예외가 발생하지 않도록 로직을 짜는 것이 중요합니다.

 

대표 예시:

  • NullPointerException : null 값을 참조할 때
  • ArrayIndexOutOfBoundsException : 배열 인덱스 범위 벗어남
  • IllegalArgumentException : 잘못된 인자 전달


3. 예외 처리(Exception Handling)

예외 처리(Exception Handling)란,프로그램 실행 중 발생한 예외 상황을 적절히 처리하여 프로그램이 비정상적으로 종료되지 않도록 하는 방법을 의미합니다.

(1) 예외 처리의 필요성

  • 프로그램이 갑작스럽게 종료되지 않고,사용자에게 의미 있는 메시지를 제공할 수 있습니다.
  • 예외가 발생해도 안정적으로 다른 작업을 수행할 수 있습니다.
  • 예외 상황을 기록(Log)하여, 문제를 추적하고 개선할 수 있습니다.

(2) 자바에서 예외 처리 방법

자바에서는 예외를 처리하기 위해 다음과 같은 구문을 제공합니다.

1. try-catch 구문

예외 발생 가능성이 있는 코드를 try 블록에 작성하고, 발생한 예외를 catch 블록에서 처리합니다. 이는 예외 발생 시 프로그램이 비정상적으로 종료되지 않도록 합니다.

try {
    int result = 10 / 0; // ArithmeticException 발생
} catch (ArithmeticException e) {
    System.out.println("0으로 나눌 수 없습니다: " + e.getMessage());
}

2. finally 블록

예외 발생 여부와 상관없이 항상 실행되는 코드를 작성합니다. 주로 리소스 정리 작업에 사용되며, 예외 처리 후에도 반드시 수행해야 하는 작업을 포함합니다.

FileInputStream fis = null;
try {
    fis = new FileInputStream("file.txt");
    // 파일 읽기 작업 수행
} catch (FileNotFoundException e) {
    System.out.println("파일을 찾을 수 없습니다.");
} finally {
    if (fis != null) {
        try {
            fis.close(); // 리소스 해제
        } catch (IOException e) {
            System.out.println("파일 닫기 중 오류 발생");
        }
    }
}

3. throws 키워드

메서드 선언부에 throws를 사용하여, 해당 메서드가 발생시킬 수 있는 예외를 호출자에게 전달합니다. 이는 예외를 직접 처리하지 않고, 호출자에게 예외 처리 책임을 넘기는 방식입니다.

public void readFile(String fileName) throws IOException {
    FileReader fileReader = new FileReader(fileName);
    // 파일 읽기 작업 수행
    fileReader.close();
}

// 호출하는 쪽에서 예외 처리
try {
    readFile("file.txt");
} catch (IOException e) {
    System.out.println("파일 읽기 중 오류 발생: " + e.getMessage());
}