본문 바로가기

Language & Framework/Java

자바 예외 처리란? 어떻게 해야하는가.

우리가 일반적으로 프로그램을 사용할 때 발생하는 프로그램 오류를 " 에러(error)"와 "예외(Exception)"으로 나눌 수 있다.

에러는 StackOverflowError, OutOfMemoryError처럼 이미 발생하는 순간 수습할 수 없는 것들이고 예외 상황은 발생하더라도 개발자의 적절한 사전 대응으로 해결할 수 있는 덜 심각한 것이다.

 

예외 클래스의 최고 존엄.. 클래스는 Exceptions이고 크게 Runtime Exceptions와 기타 Exceptions(IO Exception .. ) 으로 나뉜다.

Exceptions의 자손 클래스들은 사용자의 잘못된 사용과 관계된 에러들이라면 Runtime Exceptions는 배열 초과, null인 참조 변수 호출, 형변환 실수 등 개발자의 코딩 실수와 밀접한 관계가 있다.

또한 Exceptions의 자손 클래스에 해당하는 예외들은 개발자가 반드시 예외 처리를 해줘야 컴파일되지만 Runtime Exceptions에 해당하는 예외는 일일히 예외처리를 해주지 않아도 된다. (만약 일일히 예외처리를 해줘야 했다면 배열을 만들 때마다, 변수 호출 때마다, 형변환 때마다 예외 처리를 해야 했을 것이다..)

 

기본적으로 예외처리의 흐름은 try -> catch -> finally의 순서로 진행된다.

try에서 구문을 실행하다가 예외 상황을 만나면 catch 블럭을 돌면서 해당 예외상황에 대한 예외처리가 설정되어 있는지 탐색하고 실행한다. finally의 경우 예외가 있던 없던 반드시 실행하는 블럭이다.

* try 블럭에서 return을 하더라도 finally는 반드시 거쳐간다.

간단한 코드를 보면서 예외 처리를 찍어먹어보자.

 

 

자바에서 정수를 0으로 나누는 행위는 불가능하며 ArithmeticException을 발동시켜 코드 실행을 멈춰버린다.

따라서 ArithmeticException에 대한 예외처리를 해준다면 중간에 프로그램이 멈추는 불상사를 방지해줄 수 있다.

위 코드에 예외처리가 없었다면 고작 2번 반복하고 3번째 반복하는 도중 예외를 뿜어내며 프로그램이 중단됐을 것이다.

다음은 조금 더 복잡해진 예제를 확인해보자.

 

 

새롭게 나타난 printStackTrace와 getMessage는 예외처리가 된 상황에서도 예외 상황에 대한 정보를 보여주는 메세지다.

또한 개발자가 직접 Exception 인스턴스를 생성하여 예외를 직접 발생시킬 수도 있다.

만약 예외 상황이 여러개 설정되어 있다면 보다 구체적인 예외부터 탐색한 후 조건에 맞는 catch문이 없다면 조상인 Exception에 해당하는 catch문을 실행한다.

다음은 메서드의 예외 처리 예제를 보도록 하자.

 

예외를 메서드에서 던지고 그에 대한 처리는 main에서 해결하고 있다.

( 참고로 이것은 예제일 뿐 File의 createNewFile() 메서드는 I/O Exception에 대한 예외처리를 강제하기 때문에 throw new Exception을 던져주지 않았어도 어차피 예외 처리를 했어야 하는 상황이다. )

혹은 아래와 같이 예외 상황에 대한 처리를 메서드에서 모두 해결하고 main에서는 실행만 할 수도 있다.

 

main에 예외 처리가 있는 이유는 위에서 언급한 IOException에 대한 처리 때문이고 CreateFile 메서드에 대한 예외 처리는 메서드에서 모두 끝내고 main에서는 호출만 하고 있는 것을 확인할 수 있다.