본문 바로가기
프로그래밍/Java

[Java | 자바] 예외처리(Exception Handling)

by 불타는홍당무 2015. 4. 21.

※ 이 내용은 <자바의 정석>(남궁성 지음)을 참조하여 작성하였습니다.



프로그램이 실행 중 어떤 원인에 의해서 오작동을 하거나 비정상적으로 종료되는 경우, 그 결과를 초래하는 원인을 에러 또는 오류라고 한다.


컴파일 에러(Compile Error) 컴파일할 때 발생하는 에러

런타임 에러(Runtime Error) 프로그램 실행 도중 발생하는 에러

 에러(Error) 로그램 코드에 의해서 수습될 수 없는 심각한 오류(OutOfMemory 또는 StackOverflow)

 예외(Exception)  프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류



예외처리(Exception Handling)란?

정의 프로그램 실행 시 발생할 수 있는 예외 발생에 대비한 코드를 작성하는 것. 

목적 프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지한다.



1. 예외처리 구문(try - catch)

- try-catch에서 예외가 발생하지 않을 경우: try내에 있는 모든 문장이 실행되고 try-catch 문장 이후의 내용이 실행된다.

- try-catch에서 예외가 발생할 경우: try 내에서 예외가 발생한 이후의 문장들은 실행되지 않는다. 우선 발생한 예외에 해당하는 클래스의 인스턴스가 만들어진다. 그 다음 catch 내에 있는 문장은 반드시 실행되고, try-catch 문장 이후의 내용이 실행된다. 

- 발생한 예외의 종류와 일치하는 단 한 개의 catch블럭만이 수행된다. 발생하는 예외의 종류와 일치하는 catch블럭이 없으면 예외는 처리되지 않는다.

 try블럭 또는 catch블럭에 또 다른 try-catch문이 포함될 수 있다.

(이 때 같은 이름의 Exception 참조변수를 사용해서는 안 된다. 각 catch블럭에 선언된 두 참조변수의 영역이 서로 겹치기 때문)

 try 블록 내에서 선언한 변수를 catch에서 사용할 수 없다. 때문에 catch에서 사용하는 변수는 try 블록 앞에 선언하는 습관을 들이는 것이 좋다.

※ 예외가 발생하여 catch 블록이 실행된다고 해서 try 블록 내에서 실행된 모든 문장이 무시되는 것은 아니다. 



2. 예외 클래스의 계층 구조



Runtime Exception 프로그래머의 실수로 발생하는 예외(IndexOutOfBounds, ClassCast, NullPointer, Arithmetic)를 말한다. 예외처리를 해주지 않아도 컴파일러가 문제 삼지 않는다.

Exception 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외(FileNotFound, ClassNotFound, DataFormat). 개발자가반드시 처리를 해 주어야 한다.그렇지 않으면 컴파일이 되지 않는다.



3. finally 블럭

finally블럭은 try-catch문과 함께 예외의 발생여부에 상관없이 실행되어야할 코드를 포함시킨다. try-catch문에 선택적으로 덧붙여 사용할 수 있으며 반드시 try-catch문의 맨 마지막에 위치해야 한다.



4. 메서드에 예외 선언하기

try-catch문을 사용하는 것 이외에, 메서드에 예외를 선언하는 방법이 있다. 메서드 선언부에 키워드 throws를 사용해서 메서드 내에서 발생할 수 있는 예외를 지정해 준다. 예외가 여러 개일 경우에는 쉼표(,)로 구분한다.



5. 사용자 정의 예외 만들기

기존에 정의된 예외 클래스 외에 필요에 따라 프로그래머가 새로운 예외 클래스를 정의할 수 있다. 보통 Exception클래스로부터 상속받는 클래스를 만든다.