본문 바로가기

프로그래밍 언어/JAVA

JAVA 입문 - 예외 처리 미루기

지난 글: [프로그래밍 언어/JAVA] - JAVA 입문 - 예외 처리하기

 

예외 처리를 미루는 throws 사용하기

FileInputStream을 생성했을 때 예외 처리 방법은 두 가지(오류가 난 문장에 마우스를 올리면 나타나는 2개의 선택 항목) 있었다. Surround with try/catch는 지난 글에서 살펴봤으니 이 글에서는 Add throws declaration(예외 처리 미루기)에 대해 살펴보자. 그대로 번역하면 throws 선언을 추가한다는 의미인데, 예외를 해당 메서드에서 처리하지 않고 미룬 후 메서드를 호출하여 사용하는 부분에서 예외를 처리하는 방법이다. 아래 코드를 보자.

위 코드에서 정의한 loadClass( ) 메서드는 FileInputStream을 열고 Class를 동적으로 로딩하여 반환한다. 파일을 열 때는 FileNotFoundException이 발생할 수 있고, 클래스를 로딩할 때는 ClassNotFoundException이 발생할 수 있다. 하지만 위 코드의 7행을 보면 처리를 미루겠다는 뜻의 throws를 메서드의 선언부에 추가했다. 그럼 이 두 가지 예외는 어디에서 처리될까?

 

throws를 활용해 예외 처리 미루기

예외를 처리하지 않고 미룬다고 선언하면, 그 메서드를 호출하여 사용하는 부분에서 예외 처리를 해야한다. main( ) 함수의 16행을 보면 빨간색 줄로 오류가 표시되고 마우스를 올리면 아래와 같은 메시지를 볼 수 있다.

세 가지 옵션 중 하나를 택해 오류를 처리할 수 있다. 첫 번째 옵션은 Add throws declaration은 main( ) 함수 선언 부분에 throws FileNotFoundException, ClassNotFoundException을 추가하고 예외 처리를 미룬다는 뜻이다. main( ) 함수에서 미룬 예외 처리는 main( ) 함수를 호출하는 자바 가상 머신으로 보내진다. 즉 예외를 처리하는 것이 아니라 대부분의 프로그램이 비정상 종료된다. 따라서 다른 두 옵션 중 하나를 사용하는 것이 좋다. 두 번째 옵션 Surround with try/multi-catch를 선택하면 아래와 같이 코드가 생성된다.

이 옵션은 하나의 catch문에서 여러 예외를 한 문장으로 처리하겠다는 뜻이다. 만약 각 상황마다 예외 처리를 하려면 세 번쩨 옵션 Surround with try/catch를 선택하면 된다.

그럼 예외 상황의 수만큼 catch문이 생성된다. 각 예외 상황마다 다른 방식으로 처리해야하고 로드고 다르게 남겨야 하는 경우라면 이 옵션을 사용한다.

 

예외가 발생한 메서드에서 그 예외를 바로 처리할 것인지, 아니면 미뤄서 그 메서드를 호출하여 사용한ㄴ 부분에서 처리할 것인지는 프로그래머가 만들고자 하는 프로그램 상황에 따라 다를 수 있다. 만약 어떤 메서드가 다른 여러 코드에서 호출되어 사용한다면 호출하는 코드의 상황에 맞게 로그를 남기거나 예외 처리를 하는 것이 더 좋다고 한다. 따라서 이런 경우에는 메서드를 호출하는 부분에서 예외 처리를 하도록 미루는 것이 합리적이다.

 

다중 예외 처리

여러 catch문을 한 번에 사용하는 경우 각 catch 블록은 각각의 예외 처리를 담당한다. 그런데 문법적으로 반드시 예외 처리를 해야 하는 경우 외에도 예외 처리를 해야 할 때가 있다. 예로 배열을 사용할 때 배열의 크기보다 큰 위치, 즉 요소가 존재하지 않는 위치로 접근하는 경우 RuntimeException 중 ArrayIndexOutOfBoundsException이 발생한다. 이 예외는 컴파일러에 의해 체크되지 않는다. 이렇게 어떤 예외가 발생할지 미리 알 수 없지만 모든 예외 상황을 처리하고자 한다면 맨 마지막 부분에 Exception 클래스를 활용해 catch 블록을 추가한다. 아래 코드를 보자.

Exception 클래스는 모든 예외 클래스의 최상위 클래스이므로 다른 catch 블록에 선언한 것 이외에 예외가 발생하더라도 Exception 클래스로 자동 형 변환된다.

 

다중 예외 처리에서 주의 사항

예외는 catch문을 선언한 순서대로 검사한다. 따라서 맨 위에 catch(Exception e) 문장을 쓰면 발생하는 모든 예외 클래스는 Exception 상위 클래스로 자동 형 변환되어 오류가 발생한다. 만약 위 코드의 catch문 가장 위에 catch(Exception e) 문장을 쓴다면 오류가 발생한다. 기본(default) 예외 처리를 하는 Exception 클래스에 의해 모든 예외가 처리되므로 ClassNotFoundExceptions이나 FileNotFoundException 문장에는 예외가 도달할 일이 없어 컴파일 오류가 발생하므로 기본 예외 처리를 하는 Exception 클래스 블록은 여러 예외 처리 블록의 가장 아래에 놓아야 한다.

 

참고 서적 : 자바 프로그래밍 입문 - 박은종

'프로그래밍 언어 > JAVA' 카테고리의 다른 글

JAVA 입문 - 자바 입출력과 스트림  (0) 2022.06.13
JAVA 입문 - 사용자 정의 예외  (0) 2022.06.12
JAVA 입문 - 예외 처리하기  (0) 2022.06.11
JAVA 입문 - 예외 클래스  (0) 2022.06.11
JAVA 입문 - 스트림  (0) 2022.06.10