[JAVA] 예외 처리(Exception Handling)에 대하여, try-catch문, 오류(error)와 예외(exception)
오류(error)와 예외(exception)
자바에서 오류(error)란 시스템이 종료되어야 할 수준의 수습하기 힘든 심각한 문제를 의미한다. 이러한 오류는 개발자가 미리 예측하여 처리하기 힘든 것이 대부분이기 때문에 오류에 대한 처리는 매우 힘들다.
반면 예외(exception)는 개발자가 구현한 로직에서 발생한 실수 혹은 사용자의 영향에 의해 발생하는 예측하고 방지할 수 있는 문제를 뜻한다.
따라서 자바 개발자는 예외 처리(Exception Handling)를 통해 예외를 원활하게 처리할 수 있어야 한다.
예외 처리(Exception Handling)
자바에서는 예외를 처리하기 위해 try / catch / finally 문을 사용할 수 있다.
try{
// 예외를 처리하길 원하는 실행 코드;
}catch(e1){
// e1 예외가 발생할 경우에 실행될 코드;
}catch(e2){
// e2 예외가 발생할 경우에 실행될 코드;
}
...
finally{
// 예외 발생 여부와 상관없이 무조건 실행되는 코드;
}
- try 블록 : 가장 먼저 실행되는 코드로 여기에서 발생한 예외는 catch 블록에서 처리된다.
- catch 블록 : try 블록에서 발생한 예외 코드나 예외 객체를 인수로 전달받아 처리한다.
- finally 블록 : 예외의 발생 유무에 상관없이 마지막에 무조건 실행된다.
이러한 예외 처리는 다음과 같은 순서로 진행된다.
1. try 블록을 실행한다. 이때 예외가 발생하지 않으면 finally 블록으로 이동한다.
2. try 블록에서 예외가 발생하면 catch 핸들러는 스택에서 try 블록과 가장 가까운 catch 블록부터 차례대로 검사하여 적절한 catch 블록을 찾는다. 만약 적절한 블록을 찾지 못한다면 예외는 처리되지 않는다.
3. 적절한 catch 블록을 찾았다면 throw 문의 피연산자는 예외 객체의 형식 매개변수로 전달되고, 예외 처리가 진행된다.
4. 모든 예외 처리가 끝나면 finally 블록을 실행한다.
Exception 클래스
자바에서 모든 예외의 조상 클래스가 되는 Exception 클래스는 크게 두 가지로 구분할 수 있다.
1. RuntimeException 클래스
2. 그 외 클래스
RuntimeException 클래스는 주로 개발자의 실수로 발생하는 예외로, 치명적이지 않은 예외 상황을 발생시키는 경우가 대다수이다. 따라서 try / catch 문을 사용하기보다는 프로그램을 작성할 때 예외가 발생하지 않도록 주의를 기울이는 것이 좋다.
하지만 그 외 Exception 클래스에 속하는 예외 클래스들은 치명적인 예외 상황을 발생시키기 때문에 반드시 try / catch 문을 사용해 예외를 처리해야 한다.
따라서 자바 컴파일러는 예외가 발생할 가능성이 있는 구문을 예외 처리하지 않는다면 컴파일 오류를 발생시키고 있다.
자주 발생하는 예외들
ArithmeticException
int num = 5/0; // divide by 0
불가능한 산수를 진행하면 발생하는 예외이다. 대표적으로 divide by 0 문제, 즉 정수를 0으로 나누려고 할 때 발생한다.
ArrayIndexOutOfBoundsException
int[] arr = {1,2,3};
System.out.println(arr[3]); // 배열 범위 벗어남
배열의 범위를 벗어난 index에 접근할 시 발생한다.
FileNotFoundException
파일을 찾을 수 없을 때 발생한다.
NullPointException
String str = null;
System.out.println(str.equals("exception")); // null
존재하지 않는 레퍼런스를 참조할 때 발생한다.
OutOfMemoryException
메모리가 부족한 경우 발생한다.
참고
1. http://www.tcpschool.com/java/java_exception_class