Language/Java

예외 처리(Exception)

park_juyoung 2019. 3. 21. 19:16

 개발자가 되기위한 첫 걸음 

예외 처리란?

에러를 잡아내는 데 가장 이상적인 시기는 컴파일을 할 때이다. 그러나 컴파일할 때 모든 에러를 검출할 수 없다.

자바에서의 예외 처리 목표는 규모가 크고 신뢰성 있는 프로그램의 생성을 현재보다 적은 양의 코드를 사용해서 단순화하는 것이며, 또한 애플리케이션에는 미처리된 에러가 없다는 확신을 가지게 하는 것이다.


예외 잡아내기

자바에서 예외의 경우도 다른 자바 객체가 생성되는 것과 같은 방법으로 예외 객체가 생성된다. new를 사용하여 생성되며 힙(heap) 영역에 할당된다. 그 다음에 현재의 실행은 중지되며 예외 객체의 참조는 예외 처리 메커니즘으로 전달된다. 이러한 것을 가르켜 '예외를 던진다'라고 한다. 코드는 아래와 같다.

1
throw new NullPointerException();
cs


던져진 예외를 잡아내는 방법을 알려면 감시영역(guarded region)의 개념을 알아야한다. 감시영역은 예외를 발생시킬 수 있는 코드 영역이다.


Try 블록

메소드 내부에서 예외를 던지면 메소드를 벗어나서 에러처리 매커니즘으로 제어가 넘어간다.

메소드를 빠져나가기 위해 예외를 던지고 싶지 않다면 예외를 잡아내는 블록을 지정해야 한다. 이를 try 블록이라 한다.

그 이유는 예외를 발생시킬 수 있는 다양한 메소드 호출을 '시도(try)'하기 때문이다.


예외 처리기

던져진 예외는 어디선가 종결되어야 한다. 그곳이 예외 처리기이다. try  블록 뒤에 나오며 catch 키워드로 나타낸다.

1
2
3
4
5
6
7
8
try{
//...
}catch(Type1 t1){
 
//..
}catch(Type2 t2){
//..
}
cs

예외가 던져지면 그 예외 타입과 일치하는 인자를 가지는 첫 번째 catch문을 예외처리 메커니즘이 찾는다. 일치하는 catch 문 내부 코드를 실행 후 예외처리를 중단한다.

일치하는 catch문 하나만 실행되므로 나머지 case의 실행을 방지하기 위해 각 case 마다 break문을 가지는 switch 문과는 다르다.


예외 명세

자바에서는 우리 메소드를 호출하는 클라이언트 프로그래머에게 메소드에서 발생 될 수 있는 예외를 알리도록 한다.
예외 명세는 throws 키워드로 나타내며 그다음에 중요한 예외 타입 목록을 정의하면 된다.
1
2
3
void f() throws TooBig, TooSmall{
//..
}
cs

아무것도 없는 것은 예외를 발생시키지 않는다. 하지만 RuntimeException을 상속받는 예외는 던질 수 있다. 왜냐하면 RuntimeException 예외는 예외 명세 없이도 어디서든지 던져질 수 있다.

Finally 문

try 블록 내에서 예외의 발생여부와 상관없이 항상 실행하기를 원하는 코드가 있을때가 있다. 예외처리기의 제일 끝에 finally문을 사용하면 된다. 

Finally의 필요성
가비지 컬렉션 기능이 없고 소멸자가 자동으로 호출되지도 않는 프로그래밍 언어에서는 finally가 매우 중요하다. 왜냐하면 try 블록에서의 실행 결과와는 무관하게 프로그래머가 필요 없는 메모리를 해지할 수 있기 때문이다. 그러나 자바는 자동으로 가비지 컬렉션을 하므로 메모리 해지는 실제로 문제가 되지 않는다. 

자바의 경우는 아래와 같은 상황에서 사용할 필요가 있다.
메모리가 아닌 다른 시스템 자원을 원래의 상태로 복구 시킬 때이다.
예를 들면, open한 파일을 close한다든지, 네트워크 접속을 끊을 때, 스크린 상에 그려진 것을 복구할 때, 상태를 나타내는 변수의 값을 원래 값으로 환원할 떄이다.

마무리

예외는 자바 프로그래밍의 필수 구성 요소이다. 따라서 예외를 사용하는 방법을 잘 알아야 한다. 조금 더 깊게 공부 할 필요가 있으므로 추후 추가 수정.


내용이 도움이 되셨거나 초보 블로거를 응원하고 싶으신 분은 아래 하트♥공감 버튼을 꾹 눌러주세요! 

내용의 수정이 있거나 도움이 필요하신 분은 댓글을 남겨주세요!



'Language > Java' 카테고리의 다른 글

람다식(Lamdba Expressions) 정리  (6) 2019.03.25
컬랙션 프레임워크란?  (0) 2019.03.20
JVM 구조  (0) 2019.03.07
RxJava란? -4 Scheduler  (0) 2019.01.26
RxJava - 3 Operators 이어서  (0) 2019.01.26