메서드에 예외 선언하기

정순동·2023년 12월 10일
0

자바기초

목록 보기
42/89

예외를 처리하는 방법에는 지금까지 배운 try-catch문을 사용하는 것 외에, 예외를 메서드에 선언하는 방법이 있다.
메서드에 예외를 선언하려면, 메서드의 선언부에 키워드 throws를 사용해서 메서드 내에서 발생할 수 있는 예외를 적어주기만 하면 된다. 그리고 예외가 여러 개일 경우에는 쉼표(,)로 구분한다.

	void method() throws Exception1, Exception2, ... ExceptionN {
    	// 메서드의 내용
    }

예외를 발생시킬때 사용하는 throw와 예외를 메서드에 선언할 때 쓰이는 throws를 잘 구별하자.

만일 아래와 같이 Exception클래스를 메서드에 선언하면, 이 메서드는 모든 종류의 예외가 발생할 가능성이 있다는 뜻이된다.

	void method() throws Exception {
    	// 메서드의 내용
    }

오버라이딩에서 살펴본 것과 같이, 오버라이딩 할 때는 단순히 선언된 예외의 개수가 아니라 상속관계까지 고려해야 하기 때문에 메서드에 예외를 선언하면 그 자손타입의 예외까지도 발생할 수 있다는 점에 주의해야 한다.

메서드의 선언부에 예외를 선언함으로써 메서드를 사용하려는 사람이 메서드의 선언부를 보았을 때, 이 메서드를 사용하기 위해서는 어떠한 예외들이 처리되어져야 하는지 쉽게 알 수 있다.

자바에서는 메서드를 작성할 때 메서드 내에서 발생할 가능성이 있는 예외를 메서드의 선언부에 명시하여 이 메서드를 사용하는 쪽에서는 이에 대한 처리를 하도록 강요하기 때문에, 프로그래머들의 짐을 덜어 주는 것은 물론이고 보다 견고한 프로그램 코드를 작성할 수 있도록 도와준다.

예시

	class ThrowsExceptionTest {
    	public static void main(String[] args) throws Exception {
        	method1();
        }
    	
        static void method1() throws Exception {
       		method2();
        }
        
        static void method2() throws Exception {
        	throw new Exception();
        }
    }

위 코드는 method2에서 발생한 Exception예외를 method1 -> main에 넘겨주는 코드이다. 위 코드를 실행하면 아래와 같이 알려준다.

	Exception in thread "main" java.lang.Exception
    	at ThrowsExceptionTest.method2(ThrowsExceptionTest.java:11)
        at ThrowsExceptionTest.method1(ThrowsExceptionTest.java:7)
        at ThrowsExceptionTest.main(ThrowsExceptionTest.java:3)

이 코드에서 알 수 있는점은 아래와 같다.

  1. 예외가 발생했을 때, 모두 3개의 메서드(main, method1, method2)가 호출스택에 있었으며,
  2. 예외가 발생한 곳은 제일 윗줄에 있는 method2()라는 것과
  3. main메서드가 method1()을, 그리고 method1()은 method2()를 호출했다는 것을 알 수 있다.

위의 예시에서 method2()에서 'throw new Exception();'을 통해 예외가 강제적으로 발생했으나 try-catch문을 사용해 처리해주지 않았으므로, method2()는 종료되면서 예외를 자신을 호출한 method1()에게 넘겨준다. method1()에서도 역시 예외처리를 해주지 않았으므로 종료되면서 main메서드에게 넘겨준다.
그러나 main메서드에서도 예외 처리를 하지 않았기에 프로그램은 비정상적 종료를 하게 된다.

이처럼 예외가 발생한 메서드에서 예외처리를 하지 않고, 자신을 호출한 메서드에게 예외를 넘겨줄 수는 있지만, 이것으로 예외가 처리된 것은 아니고 예외를 단순히 전달만 하는 것이다. 결국 어느 한 곳에서는 반드시 try-catch문으로 예외처리를 해 주어야 한다.

이렇게 메서드에 예외를 선언하면 Exception과 같은 체크드(checked) 예외를 try-catch문으로 처리 하지 않아도 컴파일 에러가 발생하지 않는다.

0개의 댓글