본문 바로가기

자바

예외처리 (종류와 범위)

반응형

지난 글에서 1,2번에 대해 알아봤습니다. 

 

1. 예외가 어디서 발생하고 어디서 처리되는지

2. 예외가 발생하는 위치에 따른 코드의 흐름

3. 예외의 종류와 범위

 

 

이번에는 예외의 종류와 범위에 대해 알아보고자 합니다.

예외는 크게 프로그래머들의 실수로 발생할 수 있는 RunTimeException과 사용자들의 실수로 인해 발생 하는 Exception 이 있습니다 라고 언급되지만 여기서는 이 내용을 다루기 위한 것이 아니기에 넘어가도록 하겠습니다. 

 

 

 

이전 글들에서 썻던 예외 중 가장 상위 클래스 Exception입니다. 모든 예외의 조상이기 때문에 Exception을 쓰게 되면 모든 예외를 다 처리할 수 있습니다. 

parent 클래스를 생성하고 child 라는 자손 클래스로 이를 상속했습니다. 그리고 child c 객체를 생성하기 위해 p를 참조했지만 ClassCastException 예외가 발생하는 것을 볼 수 있습니다. 이는 조상 타입의 인스턴스를 자손 타입의 참조 변수로 참조하는 것이 허용되지 않기 때문인데 다음에 다룰 내용이기에 넘어가겠습니다. 여기서 하고자 하는 말은 ClassCastException 의 예외를 상위 클래스인 Exception에서 처리가 가능하다는 점입니다.

 

 

마찬가지로 ClassCastException의 조상인 RuntimeException 으로 예외처리가 가능합니다. 

 

 

 

 

하지만 배열의 범위를 다루는 IndexOutOfBoundsException 로는 예외처리가 불가능합니다. 

해당하는 예외가 아니기에 catch 구문에서 예외처리가 불가능 합니다.

 

 

 

이번에는 여러 가지 예외를 같이 나열해 해당항목에 맞게 처리해 보도록 하겠습니다. 

이렇게 여러가지 예외 클래스들을 동시에 나열할 수도 있습니다. 

 

 

 

그렇다면 이 순서를 한번 뒤집어 보겠습니다. 

문법적 에러가 있습니다. 아래 콘솔 창에서 'RuntimeException 은 이미 Exception에서 다뤄지고 있다.'라고 말하고 있고 나머지도 이미 'RuntimeException에서 다뤄지고 있다.' 라는 문구가 뜨는 것을 볼수 있습니다. 이미 가장 큰 범위의 Exception 에서 처리 가능하기에 다시 자손 클래스에서 예외처리를 시도하는 것은 중복되기 때문에 catch(Exception e) 이하 문장들은 필요가 없기 때문입니다. 

 

 

 

이번에는 try~catch 구문이 아닌 throws를 이용한 방식에서 주의 사항을 다루고자 합니다.

조상 클래스의 메서드를 자손클래스에서 오버라이딩 할 경우, 조상의 메소드보다 같거나 좁은 범위의 예외를 선언해야 한다는 규칙을 말하고자 합니다. 조상의 메소드를 물려받으면서 조상의 능력 범위를 벗어날 수 없다는 개념입니다. 위의 코드는 조상이 Exception을 선언하였기에 동일한 Exception 예외를 자손도 선언할 수 있습니다. 

 

 

 

이번엔 자손이 조상의 예외보다 작은 범위로 선언해 보겠습니다. 

Exception의 하위 클래스인 RuntimeException으로 범위를 줄여 자손이 오버 라이딩했습니다.

 

 

 

이번엔 반대로 조상의 예외보다 큰 범위로 자손에서 오버 라이딩해보겠습니다.

 문법적 에러가 있다고 뜨고 있습니다. 이렇게 자손은 조상보다 더 큰 예외범위를 선언할 수 없다는 것을 보았습니다. 

 

 

 

이렇게 예외처리에 대해 알아보았습니다. 일반적인 내용은 배제하고 예외처리에 대해 좀 더 시험에 잘 나올만한 내용 위주로 정리해보았습니다. 

반응형