[Java] 예외 처리 (Exception Handling)

hyunoi·2024년 11월 24일

Java

목록 보기
14/20
post-thumbnail

예외 처리


프로그램 실행 시에 발생할 수 있는 예기치 못한 예외의 발생에 대비하여 코드를 작성하는 것이다.

목적

  • 예외의 발생으로 실행 중인 프로그램이 갑작스럽게 비정상적인 동작을 하는 것을 예외 처리 선에서 막는다.
  • 에러가 발생하는 문제의 원인 파악 및 디버깅이 용이하다.
    예외 처리를 하면서 로그를 기록하거나 메세지를 출력하여 파악할 수 있다.

예외와 오류

예외와 오류는 엄연히 다른 개념이다.

  • 예외(Execption): 프로그램 내에서 처리 가능한 예측 가능한 문제
    FileNotFoundException 파일 없음
    ArrayIndexOutOfBoundsException 배열 인덱스 초과
    NumberFormatException 숫자 형식 변환 실패

  • 오류(Error): 시스템 레벨에서 발생하는 복구나 처리하기가 어려운 문제
    OutOfMemoryError 메모리 부족
    StackOverflowError 스택 오버플로우
    NoClassDefFoundError 클래스 로드 실패

Throwable 클래스에서 예외와 오류를 나눠놓은 것을 볼 수 있다.

예외 처리 유형


자바에서는 예외를 두 가지 유형으로 분류할 수 있다.

Checked Exception

컴파일 시점에서 반드시 처리해야 하는 예외
외부 환경과 상호작용할 때 발생할 가능성이 있다.
처리 하지 않으면 컴파일 오류가 발생한다.
try-catch 구조를 사용하여 예외 처리를 한다.
IOException, SQLException, ...

Unchecked Exception

대부분 프로그래머의 실수로 발생하는 예외
예외 처리를 하지 않아도 컴파일 오류가 발생하지 않는다.
런타임 중에 오류가 발생한다.
NullPointerException, ArrayIndexOutOfBoundsException, ArithmeticException, ...

try-catch-finally 구조


  1. try 블록
  • 예외가 발생할 가능성이 있는 코드를 작성한다.
  • 이 블록에서 예외가 발생하면 예외 처리를 하기 위해서 catch 블록으로 이동한다.
  1. catch 블록
  • try 블록에서 발생한 특정 예외를 처리하는 코드이다.
  • 여러 가지 예외 중 일치하는 타입의 catch 블록이 실행된다.
  • 예외가 발생하지 않으면 실행되지 않는다.
  1. finally 블록
  • 예외 발생 여부와 상관 없이 항상 실행되는 코드이다.
  • 주로 자원 해제(파일 닫기, 데이터베이스 연결 해제 등)로 사용된다.
  • finally 블록은 생략이 가능하다.
 public class MultipleCatchExample {
    public static void main(String[] args) {
        try {
            String str = null;
            System.out.println(str.length()); // NullPointerException 발생
        } catch (ArithmeticException e) {
            System.out.println("산술 예외 발생: " + e.getMessage());
        } catch (NullPointerException e) {
            System.out.println("널 포인터 예외 발생: " + e.getMessage());
        } finally {
            System.out.println("프로그램 종료 전 정리 작업");
        }
    }
}

> Output
널 포인터 예외 발생: Cannot invoke "String.length()" because "str" is null
프로그램 종료 전 정리 작업

throw와 throws


throw

  • 예외를 직접 발생시키는데 사용된다.
  • 메소드나 블록 내부에 명시
  • 특정 상황에서 의도적으로 예외를 발생시킬 때
public static void checkAge(int age) {
	if (age < 18) {
		throw new IllegalArgumentException("나이는 18세 이상이어야 합니다."); // 예외 발생
    }
    System.out.println("나이는 적합합니다.");
}

throws

  • 메소드에서 예외를 호출자에게 전달하는 것을 선언할 때 사용된다.
  • 메소드 선언부에 명시
  • 메소드 내에서 예외가 발생할 수 있음을 호출자에서 처리하도록 함
public static void readFile(String fileName) throws FileNotFoundException

예외 처리를 남발하지 말자


예외는 비용이 높은 작업이기 때문에, 논리 흐름 제어에 사용하게 되면 성능이 저하된다.
예외 처리가 필요한 부분에서만 사용해야 한다.

0개의 댓글