IMCAT.DEV
로그인 가입
Java 중급 문법

Java 예외 처리 심화

Java 예외 처리 심화 — 중급

예외 처리 심화

1. 도입 (왜 배워야 하는가)

Java의 예외 처리는 프로그램의 안정성 및 신뢰성을 높이는 중요한 기법입니다. 실무에서 예외 처리를 통해 프로그램이 예기치 않은 오류 발생 시에도 중단되지 않고, 사용자에게 친절한 오류 메시지를 제공하거나 로그를 남기는 등의 처리를 할 수 있습니다.

예를 들어, 쇼핑몰 웹 애플리케이션에서 사용자가 결제를 시도할 때, 네트워크 오류나 데이터베이스 오류가 발생할 수 있습니다. 이때 예외 처리를 하지 않으면 프로그램이 갑자기 종료되어 사용자는 혼란스러워하고, 신뢰를 잃게 됩니다. 따라서 예외 처리를 잘 이해하고 활용하는 것은 필수적입니다.

예외 처리를 모르면, 프로그램이 예기치 않게 중단되거나 사용자가 오류를 이해하지 못해 불편함을 겪을 수 있습니다. 이는 고객 경험에 나쁜 영향을 미치고, 결과적으로 비즈니스 손실로 이어질 수 있습니다.

2. 핵심 개념 설명

예외(Exception)

예외는 프로그램 실행 중에 발생하는 비정상적인 상황입니다. 예를 들어, 파일을 읽으려 할 때 파일이 존재하지 않거나, 배열의 인덱스를 잘못 접근하는 경우입니다.

체크 예외(Checked Exception)

체크 예외는 컴파일 시에 확인되는 예외로, 반드시 처리해야 합니다. 예를 들어, IOException은 파일 입출력 시 발생할 수 있는 예외입니다.

언체크 예외(Unchecked Exception)

언체크 예외는 런타임 시 발생하는 예외로, 컴파일러가 체크하지 않습니다. 예를 들어, NullPointerException은 객체가 null인 경우 발생합니다.

예외 유형예시처리 여부
체크 예외IOException반드시 처리해야 함
언체크 예외NullPointerException선택적으로 처리

3. 기본 코드 예제

public class ExceptionExample {
    public static void main(String[] args) {
        try {
            int[] numbers = {1, 2, 3};
            System.out.println(numbers[5]); // 배열의 인덱스 범위를 초과
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("배열 인덱스 오류: " + e.getMessage());
        }
    }
}

실행 결과:

배열 인덱스 오류: Index 5 out of bounds for length 3
  • 1행: ExceptionExample 클래스를 정의합니다.
  • 2행: main 메소드를 시작합니다.
  • 3행: try 블록을 시작하여 예외가 발생할 수 있는 코드를 작성합니다.
  • 4행: 배열 numbers에서 인덱스 5에 접근하려고 시도합니다. (이 부분에서 예외가 발생합니다.)
  • 5행: catch 블록이 실행되며, 발생한 예외를 처리합니다.
  • 6행: 오류 메시지를 출력합니다.
  • 4. 실전 활용 예제

    예제 1: 파일 읽기

    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.IOException;
    
    public class FileReadExample {
        public static void main(String[] args) {
            try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))) {
                String line;
                while ((line = br.readLine()) != null) {
                    System.out.println(line);
                }
            } catch (IOException e) {
                System.out.println("파일을 읽는 중 오류 발생: " + e.getMessage());
            }
        }
    }

    상황 설명: 쇼핑몰에서 제품 정보를 담고 있는 파일을 읽을 때 유용합니다. 파일이 없거나, 접근 권한이 없을 경우 예외 처리를 통해 사용자에게 친절한 오류 메시지를 제공합니다.

    예제 2: 사용자 입력 검증

    import java.util.Scanner;
    
    public class InputValidationExample {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            System.out.print("정수를 입력하세요: ");
            try {
                int number = Integer.parseInt(scanner.nextLine());
                System.out.println("입력한 정수: " + number);
            } catch (NumberFormatException e) {
                System.out.println("올바른 정수를 입력하세요: " + e.getMessage());
            }
        }
    }

    상황 설명: 사용자에게 정수를 입력받을 때, 잘못된 입력(예: 문자열)을 처리하여 예외를 발생시키고, 사용자에게 적절한 메시지를 제공합니다.

    5. 흔한 실수와 주의사항

    실수 1: 예외 처리를 하지 않음

    public class NoExceptionHandling {
        public static void main(String[] args) {
            String str = null;
            System.out.println(str.length()); // NullPointerException 발생
        }
    }

    올바른 코드:

    public class ExceptionHandling {
        public static void main(String[] args) {
            String str = null;
            try {
                System.out.println(str.length());
            } catch (NullPointerException e) {
                System.out.println("문자열이 null입니다.");
            }
        }
    }

    실수 2: 불필요한 예외 처리

    public class UnnecessaryCatch {
        public static void main(String[] args) {
            try {
                int a = 10 / 0; // ArithmeticException 발생
            } catch (Exception e) { // 모든 예외를 잡는 것은 좋지 않음
                System.out.println("예외 발생");
            }
        }
    }

    올바른 코드:

    public class SpecificCatch {
        public static void main(String[] args) {
            try {
                int a = 10 / 0;
            } catch (ArithmeticException e) {
                System.out.println("0으로 나눌 수 없습니다.");
            }
        }
    }

    6. 정리

  • 예외 처리는 프로그램의 안정성과 신뢰성을 높이는 필수 기술입니다.
  • 체크 예외와 언체크 예외의 차이를 이해하고 적절히 처리해야 합니다.
  • try-catch 구문을 사용하여 예외를 처리하고, 사용자에게 유용한 정보를 제공할 수 있습니다.
  • 다음에 학습하면 좋을 주제: 사용자 정의 예외, 예외 전파(throws), 멀티 스레드 환경에서의 예외 처리.