티스토리 뷰

dev/java

RuntimeException란 무엇인가?

IT's me 2020. 1. 10. 17:40

java RuntimeException

Java를 한다면 RuntimeException을 수도 없이 만나게 된다. 물론 직접적인 RuntimeException 을 만나진 않을 것이다. 

 

단지 아래와 같은 RuntimeException을 상속 받는 아주 많은 RuntimeException 을 만난다는 뜻이다.

 

AnnotationTypeMismatchException, ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DataBindingException, DOMException, EmptyStackException, EnumConstantNotPresentException, EventException, FileSystemAlreadyExistsException, FileSystemNotFoundException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException, IllformedLocaleException, ImagingOpException, IncompleteAnnotationException, IndexOutOfBoundsException, JMRuntimeException, LSException, MalformedParameterizedTypeException, MirroredTypesException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NoSuchMechanismException, NullPointerException, ProfileDataException, ProviderException, ProviderNotFoundException, RasterFormatException, RejectedExecutionException, SecurityException, SystemException, TypeConstraintException, TypeNotPresentException, UndeclaredThrowableException, UnknownEntityException, UnmodifiableSetException, UnsupportedOperationException, WebServiceException, WrongMethodTypeException

 

물론 위에 있는 것도 j2se 7 버전에만 있는 런타임익셉션의 일부분이고 또 수많은 라이브러리들과 프레임웤, 그리고 나 자신까지 필요에따라 RuntimeException을 상속받아 위보다 훨씬 더 많은 커스텀 RuntimeException을 만들어서 사용하고 있는 것이다. 

 

1. 실행 중에 발생하는 RuntimeException

 

말 그대로 실행 중에 발생하며 시스템 환경적으로나 인풋 값이 잘못된 경우, 혹은 의도적으로 프로그래머가 잡아내기 위한 조건등에 부합할 때 발생(throw)되게 만든다. 

 

예를 들어 프로그래머가 메소드 test에 인자 a가 0인 경우 프로그램이 더이상 동작하지 않게 하고 싶다면 RuntimeException을 발생시키면 된다.

public static void test(int a) {
  if(a == 0) {
  	throw new RuntimeException("a는 0이 되선 안됩니다~!");
  }
}

이런 사례 대표격으로 IndexOutOfBoundsException가 있다. 배열이나 리스트, 문자열의 인덱스 범위에 벗어나는 접근이 있을 때 발생하는 RuntimeException 상속 서브 클래스다. 프로그램 실행 중에 인덱스 범위에 잘못 접근하는 일이 발생하는 거라 미리 예측하기는 쉽지 않다. 

 

2. 예외 처리 하지 않아도 되는 Unchecked Exception

 

Exception은 프로그래밍 시에 예외 처리를 필수적으로 해야하는 Checked Exception과 Unchecked Exception 으로 나눌 수 있다. RuntimeException을 상속받지 않고 Exception을 상속받는 모든 Exception 는Checked Exception이다.

 

대표격으로는 입출력 관련 클래스들을 항상 Exception 처리를 달고 산다. 

 

Unhandled exception type IOException

 

따라서 try~catch 로 감싸서 catch 해주던가, 해당 메소드에 throw Exception 를 달아서 예외를 다시 호출자에게 미루는 방법을 써야 한다. 쓰지 않으면 컴파일 에러가 발생하게 된다. 반드시 예외 처리를 하게 만든다는 뜻이다. 

 

 

이와 다르게 RuntimeException은 try~catch나 throw Exception을 강제하지 않는다. 물론 예외 처리를 해도 되고 안해도 된다. 그 처리를 순수 프로그래머나 프레잌워크에 맡긴다고 생각한다. 마치

 

RuntimeException은 모든 예외를 꼭 처리하려고 하면 독이 된다. 라는 생각에서 나온 것 같다.

 

의도하지 않은 대로 프로그램이 동작 했을 때 Checked Exception으로 예외처리 해서 무시하고 계속 동작할 수 있게 해둔 프로그램과 RuntimeException 으로 프로그램 종료가 되도록 그냥 놔둔 프로그램이 있다. 

 

어떤 프로그램이 더 리스크 한지 이야기 할수 있을까? 물론 답은 케바케다. 그렇기 때문에 깊은 고민 후 선택해서 예외처리를 해둘 수 있도록 RuntimeException을 사용하면 될 것 같다. 


댓글
최근에 올라온 글
최근에 달린 댓글