본문 바로가기

멋쟁이사자처럼_부트캠프/Java

[멋쟁이사자처럼 부트캠프 TIL 회고] 백엔드 부트캠프 13기: Java 9일차 예외 처리

예외 처리

개념

 

  • 예외 (Exception): 프로그램 실행 중에 발생하는 예기치 않은 상황을 의미.
  • 예외 처리 (Exception Handling): 예외 발생 시 적절히 대처하는 방법을 의미.

예외 처리(Exception Handling) 는 프로그램 실행 중에 발생할 수 있는 예상치 못한 상황(예외)에 대비하여 프로그램의 정상적인 흐름을 유지하고 예외 상황을 안전하게 처리하는 프로그래밍 기법.(예외 처리를 하지않으면 프로그램이 중단, 종료되어 버림)

 

  • 자바에서 예외 처리는 주로 try-catch-finally 블록을 사용하여 구현됨.
    • try 블록: 예외가 발생할 수 있는 코드를 포함합니다.
    • catch 블록: try 블록에서 발생한 예외를 처리합니다.
    • finally 블록 (선택적): 예외 발생 여부와 관계없이 실행되는 코드를 포함합니다.
package day08;

public class ExceptionProcessing {
    public static void main(String[] args) {
        try {
            int result = 10 / 0; // 예외 발생 가능 코드
        } catch (ArithmeticException e) {
            System.out.println("산술 예외 발생: " + e.getMessage());
        } finally {
            System.out.println("이 코드는 항상 실행됩니다.");
        }
    }
    // 출력:
    // 산술 예외 발생: / by zero
    // 예외 처리 완료
}

 

try : 일단 이거 해봐(오류 가능성이 있는코드)

catch : 예외 캐치했어? 그럼 이거해

finally : 처리 여부 상관없이 무조건 이거 해.

 

throw: 예외를 발생시키는 키워드.

throws: 메서드가 처리하지 않고 호출자에게 예외를 전달할 때 사용하는 키워드.

 

 

 

다양한 종류의 예외 : 체크 예외(Checked Exception)언체크 예외(Unchecked Exception)

체크 예외 (Checked Exception)

체크 예외는 컴파일러가 예외 처리를 강제하는 예외입니다. 이러한 예외는 반드시 try-catch 블록으로 처리하거나 메서드 시그니처에 throws 키워드를 사용해 상위 메서드로 전달해야 합니다. 대표적인 체크 예외로는 다음과 같은 것들이 있습니다:

  • IOException: 입출력 작업 중 발생하는 예외.
  • SQLException: 데이터베이스 접근 중 발생하는 예외.
  • ClassNotFoundException: 클래스 파일을 찾을 수 없을 때 발생하는 예외.

언체크 예외 (Unchecked Exception)

언체크 예외는 컴파일러가 예외 처리를 강제하지 않는 예외입니다. 이러한 예외는 프로그램 실행 중에 예기치 않게 발생할 수 있으며, 보통 RuntimeException을 상속받는 예외들입니다. 대표적인 언체크 예외로는 다음과 같은 것들이 있습니다:

  • NullPointerException: null 참조를 접근할 때 발생하는 예외.
  • ArrayIndexOutOfBoundsException: 배열 인덱스가 범위를 벗어날 때 발생하는 예외.
  • ArithmeticException: 숫자 연산 중 발생하는 예외 (예: 0으로 나누기).
예외 계층 구조

java.lang.Throwable
    |-- java.lang.Exception
    |   |-- java.io.IOException
    |   |-- java.sql.SQLException
    |   |-- java.lang.RuntimeException
    |       |-- java.lang.NullPointerException
    |       |-- java.lang.ArrayIndexOutOfBoundsException
    |-- java.lang.Error
        |-- java.lang.OutOfMemoryError
        |-- java.lang.StackOverflowError

 

 

RuntimeException

RuntimeException은 Java의 예외 클래스 계층에서 unchecked exception으로 분류되는 예외를 나타냄. 이는 실행 시점에 발생할 수 있는 예외를 표현하며, 코드 컴파일 시점에 강제적으로 처리하지 않아도 되는 예외임.

 

1. RuntimeException의 특징

  1. Unchecked Exception:
    • 컴파일러가 예외 처리를 강제하지 않음.
    • try-catch 블록 또는 throws 키워드를 사용하지 않아도 컴파일 에러가 발생하지 않음.
  2. 실행 시점 예외:
    • 런타임에 발생하며, 일반적으로 프로그래머의 실수로 인해 발생하는 경우가 많음.
    • 예: 잘못된 로직, 유효하지 않은 데이터 접근 등.
  3. 상속 계층:
    • java.lang.Throwable → java.lang.Exception → java.lang.RuntimeException.
  4. 대표적인 서브클래스:
    • NullPointerException (널 참조 오류)
    • ArrayIndexOutOfBoundsException (배열 인덱스 초과)
    • ArithmeticException (산술 오류, 예: 0으로 나누기)
    • ClassCastException (잘못된 타입 캐스팅)

2. RuntimeException 사용 예

(1) NullPointerException

String str = null;
System.out.println(str.length()); // NullPointerException 발생

 

(2) ArrayIndexOutOfBoundsException

int[] numbers = {1, 2, 3};
System.out.println(numbers[5]); // ArrayIndexOutOfBoundsException 발생

 

(3) ArithmeticException

int result = 10 / 0; // ArithmeticException 발생

 

(4) ClassCastException

Object obj = "Hello";
Integer number = (Integer) obj; // ClassCastException 발생

 

 

3. RuntimeException 처리 방법

  • 런타임 예외는 필수적으로 처리하지 않아도 되지만, 안정적인 프로그램을 위해 적절한 예외 처리가 권장됨.
  • 예외 처리 방식:
    • try-catch 블록을 사용해 예외를 잡음.
    • 예외 발생을 방지하는 로직 추가.

예제: try-catch로 처리

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

 

예제: 방어적 코드로 예방

String str = null;
if (str != null) {
    System.out.println(str.length());
} else {
    System.out.println("String이 null입니다.");
}

 

4. RuntimeException을 사용하는 이유

  • 런타임 예외는 프로그램의 비정상적인 상태를 표현하는 데 유용.
  • 개발자가 직접 처리해야 할 예외와 그렇지 않아도 되는 예외를 구분하는 데 도움을 줌.
  • 코드 가독성을 높이고, 일반적인 오류 상황에 대비할 수 있도록 설계됨.

5. RuntimeException Checked Exception의 차이

특징 RuntimeException Checked Exception
처리 요구 처리하지 않아도 컴파일됨 반드시 처리해야 함
발생 시점 실행 시점 컴파일 또는 실행 시점
예시 NullPointerException IOException, SQLException
주된 원인 프로그래밍 실수 또는 로직 문제 외부 환경 요인 (파일, 네트워크)

 

결론

RuntimeException은 실행 중 발생할 수 있는 프로그래밍 오류를 나타내며, 개발자가 적절한 방어적 프로그래밍 또는 예외 처리를 통해 문제를 방지하거나 해결해야 함. 이를 올바르게 이해하고 활용하면 코드의 안정성을 높이고, 예외 상황에 대비할 수 있음.