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();
}
}
}
'프로그래밍 언어 기초 > JAVA' 카테고리의 다른 글
Chapter 13. 다형성(Polymorphism) (0) | 2022.12.18 |
---|---|
Chapter 12. 제네릭(Generic) (0) | 2022.12.18 |
Chapter 11. 인터페이스(Interface) (0) | 2022.12.18 |
Chapter 10. 추상클래스(Abstract class) (0) | 2022.12.18 |
Chapter 9. 객체지향 프로그래밍(OOP, Object-Oriented Programming) (0) | 2022.12.18 |