본문 바로가기

프로그래밍 언어 기초/JAVA

Chapter 14. 예외(Exception) 처리

14. 1. 예외(Exception)?

 프로그램이 어떤 원인에 의해 오동작하거나 비정상으로 종료되는 경우예외(Exception)라고 합니다. 예외(Exception)는 에러(Error)와 구분되는데, 에러(Error)메모리 부족, stack overflow와 같이 발생하면 복구할 수 없어서 디버깅이 필요한 상황을 일컫는 말이고, 예외(Exception)네트워크 끊김, 파일을 읽어오는 데 실패하는 경우 등 에러보다 비교적 가벼운 사안으로 프로그래밍 코드에 의해 수습될 수 있는 상황을 말합니다.

 

 자바에서 예외는 Throwable 클래스를 상속받습니다. 형제 클래스로써 Error 클래스가 있으며 Error 클래스를 상속받는 클래스들을 Error 계열, Exception을 상속받는 클래스를 Exception 계열이라고 합니다. Exception은 다시 두 가지로 나뉘는데 컴파일 수준에서 바로 감지가 가능한 Checked Exception 계열과 프로그램을 실행시켜 봐야 알 수 있는 Unchecked Exception 계열로 나눌 수 있습니다. Checked Exception은 예외에 대한 대처 코드가 없으면 컴파일이 진행되지 않아 컴파일 오류로 검출되고, Unchecked Exception은 예외에 대한 대처 코드가 없더라도 일단 컴파일을 진행되어 프로그램 실행 후 프로그램이 종료되면서 오류 코드와 함께 검출됩니다.

 

예외 클래스의 계층

자바에서 예외 처리는 try ~ catch 구문을 통해 구현합니다.

 

public class ExceptionTest {
	
	public static void main(String[] args) {
		
		try {
			
			int value = 1/0; // 임의의 숫자를 0으로 나누는 것은 예외를 발생 시킴!
			
		}catch(Exception e) {
			
			System.out.println("예외가 발생했습니다.");
			
		}
	}
}

 

 모든 예외의 조상 클래스인 Throwable은 다음의 세가지 메소드를 제공해줍니다.

 

메소드 설명
public String getMessage() 발생된 예외에 대한 구체적인 메시지 반환
public Throwable getCause() 예외의 원인이 되는 Throwable 객체 또는 null을 반환
public void printStackTrace() 예외가 발생된 메서드가 호출되기까지의 메서드 호출 스택을 출력.
디버깅의 수단으로 사용됨.

 

 예외는 여러 개에 대하여 대응할 수 있습니다. try ~ catch 문의 catch 절을 연장하여 대응할 수 있는데요. 여기서 주의할 것은 예외를 처리하는 것에도 자바의 다형성이 적용된다는 것입니다. 따라서, 상속 관계가 있는 예외들을 여러 개 처리할 때에는 자식 클래스에서 부모 클래스 방향으로 예외를 처리해야 합니다.

 

public class ExceptionTest {
	
	public static void main(String[] args) {
		
		try {			
			int value = 1/0; // 임의의 숫자를 0으로 나누는 것은 예외를 발생 시킴!
			
		}catch(ArithmeticException ae) {			
			System.out.println("Arithmetic 예외가 발생했습니다.");
			
		}catch (RuntimeException re) {
			System.out.println("Runtime Exception이 발생했습니다.");
			
		}catch (Exception e) {
			System.out.println("Exception이 발생했습니다.");
			
		}
	}
}

 

 

 try~catch문은 마지막에 finally 구문을 추가할 수 있는데요. 이 구문은 예외의 발생 여부와 상관없이 무조건 실행되는 구문으로써, 주로 프로그램에서 사용한 리소스를 닫는 등의 작업을 할 때 사용합니다.

 

import java.util.Scanner;

public class ExceptionTest {
	
	public static void main(String[] args) {

		Scanner sc =  new Scanner(System.in);
		
		try {			
			int value = Integer.parseInt(sc.nextLine())/0;
			System.out.println(value);
			
		}catch (Exception e) {
			System.out.println("Exception이 발생했습니다.");
			
		} finally {
			sc.close();
		}
	}

}