자바의 예외 처리

처리하지 않으면 실행조차 못 하는 예외가 있다면?

화면을 누르면 다음 장으로 넘어갑니다

예외는 객체

자바의 예외는 클래스의 객체입니다

자바의 예외 처리는 C++의 방식을 바탕으로 하되 객체지향에 더 맞게 설계됐습니다. 모든 예외는 Throwable 클래스의 자손 클래스로 만든 객체(값과 기능을 묶은 덩어리)입니다. 그래서 흔히 new로 객체를 만들면서 던집니다.

자손 클래스는 어떤 클래스를 물려받아 만든 클래스입니다(11강). MyException은 교재의 예시 이름입니다.

예외 클래스의 계층

Throwable 아래 두 갈래

Throwable 아래에는 Error와 Exception이 있습니다. Error는 힙 오버플로 같은 일에 자바 인터프리터가 던지고, 프로그램은 처리하지 않습니다. 배열 첨자 초과나 널 포인터 참조는 RuntimeException에 속합니다.

자바 인터프리터는 자바 프로그램을 실행해 주는 프로그램입니다. 힙 오버플로는 실행 중에 받아 쓰는 메모리가 모자라는 것, 널 포인터는 아무것도 가리키지 않는 참조입니다.

처리기 고르기

조상 클래스를 받는 catch도 받습니다

자바는 던진 객체와 같은 클래스이거나 그 조상 클래스(물려준 쪽)를 매개변수로 가진 첫 번째 처리기에 예외를 묶습니다. 그래서 Exception을 받는 처리기를 맨 끝에 두면 남은 예외를 모두 받습니다.

catch의 매개변수는 이름이 꼭 있어야 하고 Throwable의 자손 타입이어야 합니다. 처리기 안에서 예외를 다시 던질 수도 있습니다.

검사 예외

컴파일러가 확인하는 예외

Error와 RuntimeException, 그리고 그 자손은 비검사 예외(unchecked exception)입니다. 나머지는 모두 검사 예외(checked exception)입니다. 검사 예외는 프로그램이 대비했는지를 컴파일러가 확인합니다.

컴파일러는 소스를 실행 전에 번역하는 프로그램입니다. 실행 전에 확인해 주므로 예외를 모른 척 넘어가는 실수를 막습니다.

throws 절

처리하거나, 던진다고 적거나

검사 예외가 날 수 있는 메서드는 그 예외를 안에서 처리하거나 머리의 throws 절에 나열해야 합니다. 둘 다 하지 않으면 컴파일러가 막습니다. throws 절은 부르는 쪽에 무엇에 대비할지 알려 줍니다.

예시 코드입니다. 메서드는 객체에 딸린 함수입니다. 비검사 예외는 적지 않아도 됩니다.

다음 편

자바가 C++의 방식에 더한 것이 하나 더 있습니다

7편무슨 일이 있어도 실행할 코드는 어디에 적을까? 13강 목록