프로그램을 실했할 때 오작동이나 비정상적으로 종료되는 원인을 오류나 에러라고 한다. 에러는 컴파일 에러와 런타임 에러로 나뉜다.
자바에서는 실행 시 발생할 수 있는 오류를 '에러(error)'와 '예외(Exception)'으로 구분한다. 에러는 메모리의 부족, stack over flow와 같이 발생하게 되면 복구할 수 없는 심각한 오류이고, 예외는 발생하더라도 수습할 수 있을 정도의 프로그래머가 예외처리를 통해 막을 수 있는 오류이다.
예외에 대한 최상위 클래스로 Exception이 있다. 그리고 입출력, 런타임 예외 등 각각 해당하는 예외를 담당하는 클래스들이 이를 상속하는 모습이다.
자바에서 예외에 대한 처리는 다음과 같이 try-catch
구문으로 정의할 수 있다.
try{
//예외가 발생 할 수 있는 코드 부분
}catch(처리할 예외 타입 e){
//try블록 안에서 예외가 발생했을 때 수행되는 부분
}finally{
//예외 발생 여부와 상관 없이 항상 수행 되는 부분
//리소스를 정리하는 코드를 주로 씀
}
기본적인 try catch
구문은 위와 같이 이루어 진다. try
문에서 Exception
예외가 발생할 경우 catch
구문을 실행하게 된다.
public static void main(String[] args){
int[] arr = new int[3];
for(int i=0; i<4; i++){
System.out.println(arr[i]);
}
System.out.println("hi");
}
위의 코드에서는 에러가 난다. 배열 arr의 크기는 0~2까지 총 3인데 for문은 4번 반복하면서 arr의 4번째 공간의 값을 출력하려고하는 부분에서 나는 오류이다. 그리고 이후의 hi문자를 출력하지 않고 에러가나는 부분에서 프로그램이 멈추는 것을 볼 수 있다. 다음 예제를 보자.
public static void main(String[] args){
int[] arr = new int[3];
try{
for(int i=0; i<4; i++){
System.out.println(arr[i]);
}
}catch(ArrayIndexOutOfBoundsException e){
System.out.println(e);
}
System.out.println("hi");
}
에러가 날것 같은 부분을 try
구문으로 감쌌다. 그리고 에러가 나면 catch
구문에서 에러원인을 출력하는 것을 볼 수 있다. 여기서 중요한 점은 에러가 났음에도 그에 대한 원인만 출력하고 프로그램은 계속 실행되고 있다. 이처럼 예외에 대한 오류는 예외처리를 통해 프로그래머가 프로그램의 비정상적인 종료를 막을 수 있다.