본문 바로가기

JAVA

Java - Checked Exception VS Unchecked Exception

Exception에 대해서 간단히 알아보자. 자바에서 예외는 3가지로 나눌 수 있다. 

- Checked Exception

- Unchecked Exception

- Error

예외(Exception)

프로그램개발에서 아주 친숙(?)하게 볼 수 있는 단어이다. 이는 프로그램에서 입력 값에 대한 처리가 불가능하거나, 프로그램 실행 중에 참조된 값이 잘못된 경우(보통 개발자의 실수에서 발생한다) 등등.. 정상적인 프로그램의 흐름이 어긋나는 상황에 발생함을 의미한다. 그리고 자바에서 예외는 개발자가 직접 처리할 수 있기때문에 미리 예측하여 제어가 가능하다. 예외는 Checked Exception과 Unchecked Exception으로 나뉘며, 아래에서 다시 설명할 것이다.

에러(Error)

자바 가상머신에서 발생시키는 것이고, 예외와는 반대로 코드에서 처리가 불가능하며, 개발자가 예측하기가 쉽지도 않다. 애플리케이션 단계에서는 신경쓰지 않으나, 예방하기위해 메모리를 효율적으로 관리할 수 있도록 주의해야한다. (재귀함수 사용 등)

 

대표적인 에러들

- OutofMemoryError

- StackOverflowError

- NoClassDefFoundError

Checked Exception VS Unchecked Exception

Checked Exception

: 반드시 에러 처리를 해야하는 Exception. RuntimeException의 하위 클래스가 아니면서 Exception 클래스의 하위 클래스들로 구성된다. 보통 컴파일 단계에서 발생하며, 예외가 발생하는 경우에 롤백처리를 진행하지 않는다.

 

대표적인 checked Exception

- FileNotFoundException : 존재하지 않는 파일의 입력을 입력한 경우

- ClassNotFoundException : 존재하지 않는 클래스를 호출한 경우

- NoSuchMethodException : 지정된 메소드가 없는 경우

 

Unchecked Exception

: Checked와는 반대로 에러 처리를 강제하지 않는 Exception. RuntimeException의 하위 클래스들로 구성된다. 구성을 봤을때, 보통 Runtime 환경에 발생하며(컴파일 단계에서는 문제가 없이 넘어감) 예외가 발생하는 경우에 롤백처리를 진행한다.

 

대표적인 Unchecked Exception

- NullPointerException : 정말 엄청나게 많이 본다는 그분(?)으로, null을 참조하는 경우에 발생한다.

- ArrayIndexOutOfBoundsException : 배열의 범위에 벗어났을때 발생

Exception 관련 예약어

1] try-catch-finally (직접 처리)

try 문의 수행할 문장들에서 예외가 발생하는 경우 catch문이 수행된다. 예외별로 다중 catch 블럭 작성이 가능하다. finally구문은 예외가 발생하던, 발생하지않던 반드시 실행하는 영역이다. 이 방법을 통해서 예외가 발생시 개발자가 처리를 해줄 수 있다.

 

2] throws (간접처리)

현재 메소드에서 자신을 호출한 상위 메소드로 Exception을 발생시키는 방법. 예외를 간접적으로 처리(전가시킴)하는데, 현재 메소드에서 처리하지 않고 자신을 호출하는 메소드로 던져버린다. 그리고 상위 메소드에서는 이 예외를 처리하지 않으면, 오류가 발생하므로 주의해야한다.

 

3] throw (예외생성)

억지로 Exception을 발생시키는 키워드이다. 현재 메소드의 에러를 처리한 후에 상위 메소드에 에러 정보를 전달하여 상위 메소드에서도 에러가 발생했음을 감지할 수 있다. throws를 같이 사용한다.

 

참고자료

= https://devlog-wjdrbs96.tistory.com/351

= https://silverbullet.tistory.com/entry/Exception%EC%9D%98-%EC%A2%85%EB%A5%98%EC%99%80-%EB%B0%9C%EC%83%9D%EC%9B%90%EC%9D%B8

= https://wonyong-jang.github.io/java/2020/07/27/Java-throws-throw.html

= https://joswlv.github.io/2018/10/29/java_exception/