노블의 개발이야기

[Java] Exception이란? 본문

기타

[Java] Exception이란?

더플러스 2017. 8. 20. 23:37

Error vs Exception

Error

java.lang.Error 클래스의 서브클래스들이다. 에러는 시스템에 뭔가 비정상적인 상황이 발생했을 경우에 사용된다. 그래서 주로 자바 VM에서 발생시키는 것이고 어플리케이션 코드에서 잡으려고 하면 안된다. OutofMemoryError나 ThreadDeath 같은 에러는 catch 블럭으로 잡아도 대응 방법이 없다. 따라서 시스템 레벨에서 특별한 작업을 하는 게 아니라면 어플리케이션에서는 이런 에러에 대한 처리는 신경 쓰지 않아도 된다.

  • 오류(Error)는 시스템에 비정상적인 상황이 생겼을 때 발생한다.
  • 이는 시스템 레벨에서 발생하기 때문에 심각한 수준의 오류이다.
  • 개발자가 미리 예측하여 처리할 수 없기 때문에 애플리케이션에서 오류에 대한 처리를 신경쓰지 않아도 된다.

Exception

  • 오류가 시스템 레벨에서 발생한다면, 예외(Exception)는 개발자가 구현한 로직에서 발생한다.
  • 예외는 발생할 상황을 미리 예측하여 처리할 수 있다.
  • 예외는 개발자가 처리할 수 있기 때문에 예외를 구분하고 그에 대한 처리 방법을 명확히 알고 적용하는 것이 중요하다.

Exception





모든 예외 클래스는 Throwable 클래스를 상속받고 있으며, Throwable은 최상위 클래스 Object의 자식 클래스이다.

Exception을 두 부류로 나눌 수 있다.

  1. Exception 클래스와 Exception 클래스를 상속을 받은 나머지 클래스들 (단, RuntimeException 부류는 제외 )
  2. RuntimeException 클래스와 RuntimeException을 상속받은 클래스들

두부류로 나눈 중요한 차이점은 컴파일시의 예외 처리 체크를 하느냐 안 하느냐의 차이다. 컴파일러는 RuntimeException을 제외한 모든 Exception 클래스들을 컴파일시 예외처리( try / catch )를 했는지 반드시 확인 한다. 하지만 RuntimeException 클래스 부류가 발생했을 때는 ( try / catch )를 사용하지 않더라도 컴파일까지는 가능하다.

그런데 왜? RuntimeException은 ( try / catch )가 사용되었는지 확인을 하지 않을가?
그이유는 RuntimeException에 속하는 클래스들은 주로 개발자의 실수에 의해 발생되는 예외들이 많다.
예를 들어 ArithmeticException(0으로 나누기) , IndexOutOfBoundsException(배열범위) 등이 있다. 이런 것들은 개발자가 조금만 더 신경쓰면 예외가 발생하지 않게끔 해줄수 있기에 컴파일러가 확인하지 않게 되었다라고 볼수도 있다

RuntimeException

RuntimeException은 CheckedException과 UncheckedException을 구분하는 기준이다. Exception의 자식 클래스 중 RuntimeException을 제외한 모든 클래스는 CheckedException이며, RuntimeException과 그의 자식 클래스들을 Unchecked Exception이라 부른다.

Checked Exception과 Unchecked(Runtime) Exception

Checked Exception Unchecked Exception
처리 여부 반드시 예외를 처리해야 함 명시적인 처리를 강제하지 않음
확인 시점 컴파일 단계 실행 단계
예외 발생 시 
트랜잭션 처리
roll-back 하지 않음 roll-back 함
대표 예외 Exception을 상속받는 하위 클래스 중
Runtime Exception을 제외한 모든 예외
- IOException
- SQLException
RuntimeException 하위 예외
- NullPointerException
- IllegalArgumentException
- IndexOutOfBoundException
- SystemException

Checked Exception

  • Checked Exception이 발생할 가능성이 있는 메소드라면 반드시 로직을 try/catch로 감싸거나 throw로 던져서 처리해야 한다.
  • 컴파일 단계에서 명확하게 Exception 체크가 가능한 것을 Checked Exception이라한다.

Unchecked Exception

  • Unchecked Exception은 명시적인 예외를 처리하지 않아도 된다.
  • 이 예외는 피할 수 있지만 개발자가 부주의해서 발생하는 경우가 대부분이고, 미리 예측하지 못했던 상황에서 발생하는 예외가 아니기 때문에 굳이 로직으로 처리할 필요가 없도록 만들어져 있다.
  • 실행과정 중 어떠한 특정 논리에 의해 발경되는 Exception을 Unchecked Exception이라 한다.


'기타' 카테고리의 다른 글

[Gradle] Gradle 기본  (0) 2018.05.06
[OSX] 시스템파일 및 숨김파일 표시 또는 숨기기  (0) 2015.08.31
OAuth  (0) 2015.08.04
Comments