자바의 정석 Chapter08 예외처리

Eunkyung·2021년 10월 18일
0

Java

목록 보기
8/21

1. 예외처리

1.1 프로그램 오류

자바에서는 실행 시 발생할 수 있는 프로그램 오류를 에러와 예외 두 가지로 구분한다. 에러 발생 시 프로그램의 비정상적인 종료를 막을 수 없지만, 예외는 프로그래머가 적절한 코드를 미리 작성해 놓으면 비정상적인 종료를 막을 수 있다.

에러(error)

프로그램 코드에 의해서 수습될 수 없는 심각한 오류

예외(exception)

프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류
예외 처리를 통해 프로그램을 종료하지 않고 정상 실행 상태가 유지되도록 할 수 있음

1.2 예외 클래스의 계층구조

Exception클래스들

사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외로 일반 예외 또는 컴파일러 체크 예외라고 한다. -> 빨간 밑줄
프로그램 실행 시 예외가 발생할 가능성이 높기 때문에 자바 소스를 컴파일하는 과정에서 해당 예외 처리 코드가 있는지 검사하고 만약 예외 처리 코드가 없다면 컴파일 오류가 발생한다.

RuntimeException클래스들

프로그래머의 실수로 발생하는 예외로 컴파일러 넌 체크 예외라고 한다.
프로그램 실행 시 예측할 수 없이 갑자기 발생하기 때문에 컴파일하는 과정에서 예외 처리 코드가 있는지 검사하지 않는다.

1.3 예외처리하기

컴파일 시 일반 예외가 발생할 가능성이 있는 코드를 발견하면 컴파일 에러를 발생시켜 강제적으로 예외 처리 코드를 작성하도록 요구하지만 실행 예외는 컴파일러가 체크하지 않기 때문에 개발자의 경험을 바탕으로 예외 처리 코드를 작성해야 한다.

  • try-catch-fianlly 블록
try {
	// 예외가 발생할 가능성이 있는 문장
} catch (Exception e) {
	// 예외 발생 시 처리하기 위한 문장
} finally {
	// 예외 발생 여부와 상관없이 항상 수행되어야하는 문장들
}
  • 다중 catch 블록
    예외 처리 코드를 다르게 하기 위해서 다중 catch 블록을 작성한다. try 블록에서 하나의 예외발생 시 즉시 실행을 멈추고 해당 catch 블록으로 이동하기 때문에 catch 블록이 여러 개일지라도 단 하나의 catch 블록만 실행된다.
    이 때, catch 블록은 위에서부터 차례로 검색되기 때문에 상위 예외 클래스는 하위 예외 클래스보다 아래쪽에 위치해야 한다.
try {
	// 예외가 발생할 가능성이 있는 문장
} catch (ArrayIndexOutOfBoundsException e) {
} catch (NumberFormatException e) {
} finally {
	// 예외 발생 여부와 상관없이 항상 수행되어야하는 문장들
}
  • 예외 떠넘기기
    throws를 메소드 선언부 끝에 작성하면 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠넘긴다.
    throws 키워드가 있는 메소드는 반드시 try 블록 내에서 호출되어야 하며 catch 블록에서 떠넘겨 받은 예외를 처리해야 한다.
    main() 메소드에서 throws 키워드를 사용해서 예외를 떠넘기면 JVM이 예외 내용을 콘솔에 출력하여 예외 처리를 하게 된다. 그러나 이 방법은 좋지 않은 방법이므로 main()에서 try-catch 블록으로 예외를 처리하는 것이 바람직하다.
public class ThrowsExample {
    public static void main(String[] args) {
        try {
            findClass(); // 메소드 호출한 곳에서 예외 처리
        } catch (ClassNotFoundException e) {
            // 예외 처리 코드
            System.out.println("클래스 존재하지 않음");
        }
    }
    // 예외 떠넘기기
    public static void findClass() throws ClassNotFoundException {
        Class clazz = Class.forName("java.lang.String2");
    }
}

출처

profile
꾸준히 하자

0개의 댓글