Java의 예외처리

2025. 4. 7. 18:52·CS 스터디/CS - JAVA

예외 처리란?


예외(Exception)는 프로그램 실행 중 발생하는 예상하지 못한 오류를 의미합니다. 프로그램 실행 중, 예외가 발생하면 그 즉시, 프로그램이 종료하게 되는데, 이를 방지하기 위해 필요한 것이 바로 예외 처리(Exception Handling)입니다.

 

Java에서는 예외를 두 가지 유형으로 관리합니다. 먼저, Java의 예외 클래스의 계층 구조도와 함께 Java의 예외 처리 종류에 대해 자세히 살펴보겠습니다.

 

Java의 예외 클래스 계층 구조


 

Java의 예외 처리 종류


1. 체크드 예외 ( Checked Exception )

컴파일 타임에 반드시 처리해야 하는 예외

예외 처리를 하지 않는다면, 컴파일 오류가 발생

체크드 예외를 처리하는 방법

  • 체크 예외는 반드시 try-catch구문 을 사용하거나 메서드 시그니처에서 throws 키워드를 사용해 예외를 선언해야함
  • 예외 처리를 하지 않는다면, 컴파일 오류가 발생

언체크 예외 발생 예시 코드

import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class CheckedExceptionExample {
    public static void main(String[] args) {
        File file = new File("example.txt");

        try {
            // 파일을 읽으려 시도 (IOException 발생 가능)
            FileReader reader = new FileReader(file);
            System.out.println("File opened successfully.");
        } catch (IOException e) {
            // 체크드 예외를 반드시 처리해야 함
            System.out.println("An error occurred while opening the file: " + e.getMessage());
        }
    }
}

2. 언체크드 예외 ( Unchecked Exception )

프로그램이 정상적으로 실행되는 중에 발생할 수 있는 예외로, 반드시 처리할 필요는 없는 예외

언체크 예외를 처리하는 방법

핵심은 대부분 개발자의 실수나 논리적 오류로 인해 발생하므로, 처리라는 개념보다 사전에 방지하는 개념의 접근이 필요

언체크드 예외 발생 예시 코드

public class UncheckedExceptionExample {
    public static void main(String[] args) {
        int[] numbers = {1, 2, 3};

        // 잘못된 배열 인덱스 접근 (ArrayIndexOutOfBoundsException 발생)
        System.out.println("Accessing invalid index:");
        System.out.println(numbers[5]); // 런타임에 예외 발생
    }
}

체크 예외를 처리하는 방법


1. 예외 복구 ( Exception Recovery )

발생한 예외를 처리하여 프로그램을 정상적으로 실행할 수 있도록 대체행동을 수행하는 방식

사용자에게 영향을 최소화하기 위한 행동 (사용자가 인지하지 못함)

  • 대표적으로 try-catch블록을 사용하여 예외를 복구

예외 복구 예시 코드

import java.io.*;

public class RecoveryExample {
    public static void main(String[] args) {
        try {
            BufferedReader reader = new BufferedReader(new FileReader("config.txt"));
            String config = reader.readLine();
            System.out.println("설정: " + config);
        } catch (IOException e) {
            // 예외 발생 시 기본 설정으로 복구
            System.out.println("설정 파일을 읽지 못함. 기본 설정으로 진행합니다.");
            System.out.println("설정: DEFAULT");
        }
    }
}

2. 예외 처리 회피 ( Exception Handling Avoidance )

예외 처리 회피는 예외를 직접 해결하지 않고 호출한 쪽으로 넘기는 방식

예외 처리를 더 적합한 위치에서 수행하도록 설계된 방법으로, 대표적으로 if문과 throws를 활용하여 작성할 수 있습니다.

  • if 조건문을 사용하여 예외 발생 전 예외 상황을 미리 확인하여, 예외가 발생하지 않도록 회피
  • throws 키워드를 사용하여 메서드 시그니처에서 발생 가능한 예외를 선언

예외 처리 회피 예시 코드

// throws로 예외 처리 회피 코드 예시
import java.io.*;

public class AvoidanceExample {
    public static void main(String[] args) throws IOException {
        // 예외를 직접 처리하지 않고, 호출한 쪽(Main)에서 처리하거나 전달
        String content = readFile("data.txt");
        System.out.println("파일 내용: " + content);
    }

    // 여기서 예외를 처리하지 않고 throws로 회피함
    static String readFile(String filename) throws IOException {
        BufferedReader reader = new BufferedReader(new FileReader(filename));
        return reader.readLine();
    }
}

3. 예외 전환 ( Exception Transformation )

발생한 예외를 다른 형태의 예외로 변환하는 방식

기존의 예외를 좀 더 명확한 예외로 전환해서 넘기는 방법입니다.

  • 사용자 정의 예외(throw)나 throws 키워드를 사용하여 예외를 더 명확하게 전환
import java.io.*;

// 사용자 정의 예외 (의미를 담은 예외 클래스)
class DataLoadException extends Exception {
    public DataLoadException(String message, Throwable cause) {
        super(message, cause);
    }
}

public class TranslationExample {

    public static void main(String[] args) {
        try {
            loadData();  // 하위 예외를 전환해서 호출
        } catch (DataLoadException e) {
            // 더 의미 있는 예외를 받아서 처리
            System.out.println("데이터 로딩 실패: " + e.getMessage());
        }
    }

    // IOException → DataLoadException 으로 전환
    static void loadData() throws DataLoadException {
        try {
            BufferedReader reader = new BufferedReader(new FileReader("important-data.txt"));
            String line = reader.readLine();
            System.out.println("파일 내용: " + line);
        } catch (IOException e) {
            // 예외 전환 발생 (기술 예외 → 의미 있는 예외)
            throw new DataLoadException("파일을 읽는 중 문제가 발생했습니다.", e);
        }
    }
}

 

Error


자바에서 Error는 JVM(Java Virtual Machine)이 발생시키는 심각한 문제를 의미하며, 개발자의 코드로 복구가 불가능한 문제입니다.

Error의 특징

1. 복구 불가능

Error는 JVM이나 하드웨어 등 시스템 차원에서 발생하는 심각한 문제로, 애플리케이션 코드 수준에서는 이를 복구할 수 없습니다.

2. 비가역적 문제

대부분의 Error는 프로그램이 비정상적인 상태에 진입했음을 의미합니다.
이를 해결하기 위해 프로그램 종료나 JVM 재시작이 필요한 경우가 많습니다.

3. Throwable 클래스 상속

Error는 자바의 Throwable 클래스를 상속받습니다. 이는 예외(Exception)와 공통점이지만, 처리 가능성 측면에서 차이가 있습니다.

대표적인 Error의 종류

  • OutOfMemoryError : JVM의 힙 메모리 공간 부족
  • StackOverFlowError : 재귀호출이 깊어져서 스택이 넘침
  • VirtualMachineError : JVM자체의 문제
  • NoClassDefFoundError : 필요한 클래파일이 실행중에 없음

Error vs Exception

 

'CS 스터디 > CS - JAVA' 카테고리의 다른 글

객체 지향 설계 5대 원칙 (SOLID)  (0) 2025.04.14
equals()와 hashcode()  (0) 2025.04.08
final, finalize, finally의 차이와 활용  (0) 2025.04.01
String, StringBuilder, StringBuffer 특징 및 성능비교  (0) 2025.03.26
String 객체와 String 리터럴  (0) 2025.03.25
'CS 스터디/CS - JAVA' 카테고리의 다른 글
  • 객체 지향 설계 5대 원칙 (SOLID)
  • equals()와 hashcode()
  • final, finalize, finally의 차이와 활용
  • String, StringBuilder, StringBuffer 특징 및 성능비교
BIS's tech Blog
BIS's tech Blog
Welcome to Kanghyun's tech blog :)
  • BIS's tech Blog
    벼익숙의 기술 블로그
    BIS's tech Blog
  • 전체
    오늘
    어제
    • 분류 전체보기 (69)
      • 알고리즘 (55)
        • 백준 (46)
        • 프로그래머스 (9)
      • CS 스터디 (14)
        • CS - JAVA (11)
        • CS - DB (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    DFS
    기술질문
    프로그래머스
    Baekjoon
    java
    BFS
    재귀
    Lv2
    깊이 우선 탐색
    Top-Down
    dp
    CS
    백트래킹
    백준
    자료구조
    알고리즘 고득점 kit
    동적 계획
    완전탐색
    너비 우선 탐색
    브루트포스
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
BIS's tech Blog
Java의 예외처리
상단으로

티스토리툴바