자바에서는 try ~ catch ~ finally 구문을 사용해 예외처리를 지정할 수 있다.
public static void main(String[] args) {
int err = 0;try {
err = 1 / 0;
System.out.println("0/1의 값 : "+err);
} catch(Exception e) {
System.out.println("에러 발생 : "+e.getMessage());
}
System.out.println("try ~ catch문 아래부분 실행");
}
}
위의 예문을 보면 try 블럭안에 일부로 1을 0으로 나누는 오류를 일부로 발생시켰다. 오류가 발생하며 try 블럭안에 문장은 수행을 중단하고 catch 블럭으로 제어권이 넘어가 catch 블럭을 수행한다. 위의 예문을 실행시킨 결과는 다음과 같다.
에러 발생 : / by zero
try ~ catch문 아래부분 실행
try 블럭안에 있는 "0/1의값" 출력문은 수행되지 않는다. 하지만 try catch 블럭을 벗어난 부분은 처리한다. 즉, try 블럭안에 문장을 수행하다 예외가 발생하면 try 블럭은 예외가 발생한 줄까지만 수행되고 그 다음 줄 부터는 수행되지 않는다. 그 다음 try 블럭의 수행을 멈추고 catch 블럭을 수행한다. finally 블럭은 예외가 발생하지 않거나 발생해도 무조건 수행되는 코드를 넣어 놓는 부분이다.
■ try ~ catch ~ finally 문법
try {
// 예외가 발생할 수 있는 문장(예외:가벼운 오류)
} catch(Exception e) {
// 예외가 발생했을 때 예외를 처리하기 위한 문장
} finally {
// 예외가 있거나 없거나 무조건 처리되는 문장
}
public class Execute {
public String test() {
int[] i = new int[2];
try{
System.out.println("시작\n");
i[4] = 1; // 여기서 null 오류가 발생
System.out.println("-- 오류를 발생한 후 출력 --"); // 실행되지 않음
} catch(Exception e) {
System.out.println("** 오류 발생 **");
System.out.println("오류 원인 : " + e.getCause() + " || 오류 메세제 : " + e.getMessage());
return "**오류가 발생했습니다.**";
} finally {
System.out.println("\nfinally 구문안\n"); // 무조건 실행
}
return "";
}
public static void main(String[] args) {
Execute e = new Execute();
System.out.println(e.test());
}
}
시작
** 오류 발생 **
오류 원인 : null || 오류 메세제 : 4
finally 구문안
**오류가 발생했습니다.**
※ 예외 처리시 주의사항
try 블럭에서 프로그램을 수행하다 예외가 발생하면 catch 블럭을 수행한다. 예외를 처리하는데 있어서 '오류 아토믹성(failure actomic)'에 주의해야 한다. 오류아토믹성이란 예외를 처리할 때 객체가 어중간한 상태에 빠지지 않게 주의해아 함을 말한다.
즉, 무조건 예외처리를 해버리면 실행되고 있는 객체가 이상한 상태에 빠져 있을 가능성이 있다. 즉, 연속적인 처리를 해야 하는 경우 중간에서 처리가 멈추고 예외 처리를 해버리면 객체는 롤백을 해야 하는 상태를 생략하게 된다. 이런 상태를 막아야 하기 때문에 예외 처리시 객체가 하는 책임에 초점을 맟줘서 처리해야 한다.
또한, 개발시에는 예외를 던질 수 있지만 실제 사용시에는 예외를 처리함에 있어 프로그래머는 명시적으로 지정해야 합니다. 따라서 예외처리에 대해서 분명하게 대처해야 좋은 코드를 만들 수 있다.
'자바(Java) > JAVA 2SE' 카테고리의 다른 글
JAVA 개발 환경 (0) | 2009.11.19 |
---|---|
java.util.ArrayList<객체> - 컬렉션 (0) | 2009.11.11 |
java.util.Iterator - 콜렉션 (0) | 2009.10.30 |
java.util.HashTable - Hash 처리의 발전형 (0) | 2009.10.30 |
java.util.HashMap - Hash 객체 (0) | 2009.10.30 |