Skip to main content

예외처리 (Exception Handling)

예외 처리란 ?

예외처리란, 프로그램 실행 시 발생할 수 있는 예기치 못한 예외의 발생에 대비한 코드를 작성하는 것입니다. 예외처리를 함으로써 프로그램의 비정상적인 종료를 막고, 정상적인 실행상태를 유지할 수 있도록합니다.

에러 ( Error )

  • 컴파일 에러 - 컴파일 시에 발생하는 에러
  • 런타임 에러 - 런타임(실행) 시에 발생하는 에러
  • 논리적 에러 - 실행은 되지만, 의도와 다르게 동작하는 것

자바에서는 실행 시에 발생할 수 있는 프로그램 오류를 에러(Error)와 예외(Exception) 두 가지로 구분합니다.

  • 에러 - 발생하면 복구할 수 없는 심각한 오류, 비정상적 종료를 막을 수 없음.
  • 예외 - 발생하더라도 수습될 수 있는 비교적 덜 심각한 것, 적절한 코드를 미리 작성함으로써 비정상적인 종료 막을 수 있음.

자바에서는 오류와 예외를 클래스로 정의하였습니다. ( Class Error, Class Exception )

Exception클래스의 종류는 크게 Exception을 상속받은 예외들과, Exception을 상속받은 RuntimeException 하위의 예외들로 나눌 수 있습니다.

  • Exception
    • 외부의 영향으로 발생할 수 있는 것들.
    • 발생 가능성이 있을 때, 예외처리 강제함.
    • FileNotFoundException, ClassNotFoundException, DataFormatException
  • RuntimeException
    • 자바의 프로그래밍 요소들과 관계가 깊음.
    • 예외처리 강제 X
    • IndexOutOfBoundsException, NullPointerException, ClassCastException, ArithmeticException.

예외처리하기

발생한 예외를 처리하지 못하면 어떻게 될까요 ? 프로그램은 비정상적으로 종료되며, 처리되지 못한 예외는 JVM의 예외처리기(UncaughtExceptionHandler)가 받아서 예외의 원인을 화면에 출력합니다.

  1. try-catch 구문
public static void main(String args[]){

try {
// logic.
} catch (Exception e){
System.out.println(e);
}
}
  1. 예외를 메소드에 선언하는 방법.
void method() throws Exception1, Exception2 {

}

이렇게 예외를 명시하면 메서드 내부에서 발생할 수 있는 예외를 확인할 수 있다는 장점이 있습니다.

일반적으로 RuntimeException은 적지 않으며 Exception관련 예외만 적습니다.

(Exception은 Checked Exception이며 RuntimeException은 Unchecked Exception이기 때문에)

이렇게 메서드의 throws를 명시하는 것은 사실 예외를 처리한다기보다는 자신을 호출한 메서드에게 예외를 떠맡기는 것에 가깝습니다.

(결국 어느 한 지점에서 (최종적으로는 main 메소드가 될 것 ) 예외에 대한 처리가 되지않으면 프로그램은 다운될 것 입니다.)

  1. finally 블럭

    try-catch문과 함께 예외의 발생여부에 상관없이 실행되어야할 코드를 위해 사용됩니다.

try {
// 메인 로직.
} catch (Exception1 e) {
// 예외 처리.
} finally {
// 예외 처리가 이루어지든 메인 로직이 정상적으로 실행되든 상관없이 동작되는 코드.
}

예외 발생시키기

키워드 throw을 사용하면 고의로 예외를 발생시킬 수 있습니다.

예외 되던지기 (exception re-throwing)

예외를 처리한 후에 인위적으로 다시 발생시키고, 발생한 예외를 throws로 선언함으로써 예외를 발생한 메서드와 호출 메서드에서 나누어 처리하도록 하는 방법입니다.

사용자정의 예외

기존의 정의된 예외 클래스 외에 필요에 따라 프로그래머가 새로운 예외 클래스를 정의하여 사용할 수 있습니다.

class CustomException extends RuntimeException {

//메세지를 인자로 받는 생성자.
MyException(String msg) {
super(msg);
}
}

RuntimeException을 상속받은 커스텀 예외는 예외 발생시 예외 처리가 강제되지 않지만 Exception을 상속받을경우 예외 처리가 강제됩니다. 저자는 RuntimeException을 개인적으로 추천.

예외 처리 관련해서 공부해 볼 것들

  • 좋은 코드 나쁜 코드: Chapter 4 오류