[Java] 예외(Exception)의 종류
Java

[Java] 예외(Exception)의 종류

개발하면서 절대 안마주쳤으면 하지만 결국에는 마주하게되는게 바로 예외인 것 같습니다. 이 예외에도 큰 틀에서 종류가 존재한다는 것을 알고 계셨나요? 지금부터 바로 알아보겠습니다!

 

예외(Exception)와 에러(Error)는 다르다

예외를 설명하기전에 우선 예외와 에러에 대해서 간단히 짚고 넘어가겠습니다. 우리는 보통 예외가 발생하면 에러가 발생했다고 생각합니다. 하지만 Java에서 예외와 에러는 엄연히 다른 개념입니다!

 

에러(Error): 에러는 자바 프로그램 밖에서 발생한 오류를 뜻합니다. 예시로 프로그램이 동작하는 서버 자체가 고장이 났다거나, OS에 비정상적인 상황이 발생해서 JVM이 제대로 실행될 수 없는 경우 등이 있습니다. 예시를 보면 아시겠지만 에러는 애플리케이션 내 코드로 해결할 수 없기에 복구가 불가능합니다.

 

예외(Exception): 예외는 사용자의 잘못된 조작이나 개발자의 코딩 로직의 실수로 인해 발생하는 프로그램 오류를 뜻합니다. 예외는 예외처리 코드를 통해 프로그램을 종료하지않고 다시 정상 실행상태가 유지되도록 할 수 있습니다.

 

*추가 차이: 에러(Error)는 프로세스에 영향을 주고, 예외(Exception)는 Thread에만 영향을 줍니다.


예외의 종류

자 그럼 이제 본격적으로 예외에 대해서 알아볼까요! 먼저 아래 그림을 통해 예외는 어떻게 만들어졌는지 (어떤 클래스를 상속받았는지) 살펴봅시다.

https://butter-shower.tistory.com/87

 

그림에서 나온것처럼 시작은 모든 자바클래스의 최고 조상 클래스인 Object 클래스로부터 시작됩니다. 그리고 에러와 예외 모두의 조상격인 Throwable 클래스가 있습니다.

[Throwable 클래스란?]
Throwable 클래스의 역할은 오류나 예외에 대한 메시지를 담는것이다. 대표적으로 getMessage()와 printStackTrace() 메소드가 포함되어있어서 오류/에러에 대한 정보를 담고 보여줄 수 있게 해준다.

드디어 예외가 등장했습니다. 예외는 크게 Checked ExceptionUnchecked Exception으로 분류할 수 있습니다. RuntimeException 을 상속하는 클래스는 Unchecked Exception으로 분류가 되고, 아닌 클래스는 Checked Excetion 으로 분류됩니다.

 

Checked Exception
- 반드시 명시적인 예외 처리(try-catch 또는 throws)를 해야하며, 컴파일 시점에서 예외 발생과 제대로 처리했는지 확인된다.
- 대표적으로 IOException, SQLException 등 이 있다

Unchecked Exception
- 컴파일 후 런타임시 발생할 수 있는 예외이다. 명시적인 예외처리를 해주지 않아도 컴파일이 된다.
- 대표적으로 NullPointerException, ArithmeticException (0으로 나눌경우), ArrayIndexOutOfBoundsException이 있다.


예외 처리 방법

위와 같은 예외가 발생했을 때 처리하는 방법에는 크게 3가지가 있습니다.

예외 복구: 예외 상황을 파악하고 문제를 해결하여 정상 상태로 돌려놓는 방법입니다.
예외 회피: throws 키워드를 통해 직접 처리하지않고 호출한 쪽으로 던져 회피하는 방법입니다.
예외 전환: 회피와 비슷하게 메소드 밖으로 예외를 throw 하지만 그냥 던지지않고 적합한 의미를 가진 예외로 변경하여 던지는 것입니다.


Q & A

  • 그럼 Unchecked Exception이 발생했는데 try-catch 블록이 하나도 없으면 어떻게 되나요?
    • 발생한 Exception은 호출스텍(call stack)의 최상단까지 거슬러 올라가게됩니다.
    • 올라가다보면 Java의 최상단 메소드인 main() 메소드까지 올라가고 여기서도 잡히지 않으면 Exception은 결국 JVM 까지 거슬러올라갑니다.
    • JVM은 Exception을 받게되면 console에 stack trace를 프린트한 후 non-zero exit code 로 프로그램을 종료(terminate)합니다.
    • 따라서 unchecked Exception을 명시적으로 사용한다면 프로그램이 갑자기 종료되지 않도록 조심해야합니다.

 

오늘은 예외에 대해서 알아보았습니다. 굉장히 자주 마주했지만, 제대로 모르고 있었던 부분이어서 많은 반성을 하게되었습니다. 궁금한 점은 댓글에 남겨주시면 Q&A에 추가하겠습니다!

 

 

출처:
- [Java] 예외처리 - try~catch 문, throws문, 예외의 종류
- [Java] Checked Exception과 Unchecked Exception
- [JAVA] 예외처리 방법과 종류 [Checked , Unchecked Exception]
- [Java] 예외의 종류
- 자바(JAVA) - exception의 종류와 예외 처리(Exception Handling, try-catch)