Exception

김성민·2023년 10월 22일

프로그램 오류(error)

컴파일 에러 : 컴파일 시에 발생하는 에러
ex) syntax error
런타임 에러 : 실행 시에 발생하는 에러
ex) 말그대로 프로그램 실행 시 발생하는 에러
논리적 에러 : 실행은 되지만, 의도와 다르게 동작하는 것
ex) 재고량이 음수가 된다던가 게임 캐릭터의 hp가 0이 되어도 죽지 않는 버그

오류(error)와 예외(exception)

자바 프로그래밍에서는 실행 시(runtime) 발생할 수 있는 오류를 '에러(error)'와 '예외(exception)' 두가지로 구분한다.

에러(error) : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
예외(exception) : 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류

에러나 예외는 발생 시 프로그램이 종료되는것은 같지만 예외는 예외처리를 통해 프로그램을 종료하지 않고 정상 실행 상태가 유지되도록 할 수 있다.

예외 처리(Exception Handling)
예외 처리란 프로그램 실행 시 발생할 수 있는 예기치 못한 예외의 발생에 대비한 코드를 작성하는 행위를 말한다.
프로그램 실행도중에 발생하는 에러는 어쩔 수 없지만, 예외는 프로그래머의 실력에 따라 충분히 포괄적으로 방지할 수 있기 때문이다. 따라서 예외 처리의 목적은 예외의 발생으로 인한 실행중인 프로그램의 갑작스런 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것이다.

예외 클래스(Exception Class)

자바에서는 예외를 클래스를 통해 관리한다. 모든 예외 클래스는 java.lang 패키지의 Exception 클래스의 상속을 받으며 크게 두 종류로 구분할 수 있다. checked exception과 unchecked exception(runtime exception)이다.

1. Checked Exception

exception을 상속하는 하위 클래스 중 Runtime Exception을 제외한 모든 Exception은 Checked Exception이다. 만약 코드 내에서 Checked Exception을 발생시킨다면, 해당 예외는 반드시 try-catch 또는 throws 구문을 통해서 처리해야 한다.

예를들면, 존재하지 않는 파일을 처리하려는 경우(FileNotFoundException), 실수로 클래스의 이름을 잘못 입력한 경우(ClassNotFoundException), 입력한 데이터의 형식이 잘못된 경우(DataFormatException)에 발생한다.

2. UnChecked Exception(Runtime Exception)

RuntimeException 클래스를 상속하며, 프로그램 실행 중에 발생하는 예외를 unchecked exception 혹은 runtime exception라고 한다. 이 예외는 컴파일 타임이 아니라 런타임에 검사되므로 컴파일 에러는 발생하지는 않으며, 검사 예외와는 다르게 예외 처리를 강제하진 않는다. unchecked exception에는 어떤 수를 0으로 나누는 것과 같이 비정상적인 계산 도중에 발생하는 ArithemeticException, 인덱스가 배열의 범위를 넘어설 경우에 발생하는 IndexOutOfBoundsException 등이 있다.

런타임 예외 클래스의 종류 :

예외(Exception) 처리하기

try-catch 블록

try 블록 내에서 예외가 발생할 수 있는 코드를 묶고, catch 블록에서 예외를 처리하는 코드 작성한다. 만약 try 블록에서 예외가 발생하면 해당 예외에 대응하는 catch 블록이 실행된다.

try {
    // 예외가 발생할 수 있는 코드
} catch (예외유형1 e1) {
    // 예외 유형1에 대한 처리
} catch (예외유형2 e2) {
    // 예외 유형2에 대한 처리
} finally {
    // 예외 발생 여부와 상관없이 항상 실행되는 코드 (선택사항)
}

throw

throw 키워드를 사용하여 직접 예외를 발생시킬 수 있다. 개발자가 특정 조건에서 예외를 일으키고자 할 때 사용함. 예외 객체를 생성하고 throw 키워드를 통해 해당 예외를 던지면, 예외 처리 블록(try-catch)에서 해당 예외를 처리할 수 있다.

throw new 예외유형("예외 메시지");

throws

메서드 선언부에서 throws 키워드를 사용하여 해당 메서드가 어떤 예외를 던질 수 있는지를 적을 수 있다. 이 메서드를 호출하는 코드에서는 이러한 예외를 처리하거나 다시 던지도록 강제된다.

public void 메서드명() throws 예외유형1, 예외유형2 {
    // 메서드 내용
}

0개의 댓글