Java에서 Throwable 클래스는 모든 오류(Error)와 예외(Exception)의 최상위 클래스입니다. 이 클래스의 인스턴스는 JVM(Java Virtual Machine)에 의해 자동으로 던져지거나, 개발자가 throw 문을 사용하여 직접 던질 수 있습니다. 마찬가지로 catch 절의 인자 타입으로도 Throwable 클래스 또는 그 하위 클래스를 지정할 수 있습니다.
Throwable의 두 가지 핵심 하위 클래스인 Error와 Exception은 비정상적인 상황이 발생했음을 나타내는 데 사용됩니다. 이 인스턴스들은 예외 상황이 발생한 시점에 생성되며, 해당 상황과 관련된 정보를 함께 담고 있습니다.
Error는 OutOfMemoryError나 StackOverflowError처럼 JVM이 더 이상 정상적으로 동작하기 어려운 심각한 시스템 수준의 문제를 의미하며, 일반적으로 애플리케이션 코드에서 복구하지 않습니다. 반면 Exception은 0으로 나누기, 존재하지 않는 파일 접근 등 프로그램이 처리할 수 있는 비정상적인 상황을 나타내므로, try-catch 블록을 통해 적절하게 처리해야 합니다.
Throwable 클래스의 주요 메소드
- public String getMessage(): 예외에 대한 메시지 문자열을 반환합니다.
- public Throwable getCause(): 예외의 원인을 반환합니다. 원인을 알 수 없거나 존재하지 않는 경우 null을 반환합니다.
- public String toString(): 예외에 대한 간단한 설명(클래스 이름 + 메시지)을 반환합니다.
- public void printStackTrace(PrintStream s): 예외에 대한 간단한 설명(toString() 결과)과 스택 트레이스를 표준 에러 출력 스트림(System.err)에 출력합니다.
예제 코드
class ArithmaticTest {
public void division(int num1, int num2) {
try {
// 여기서 java.lang.ArithmeticException 발생
System.out.println(num1/num2);
} catch(ArithmeticException e) {
// 예외에 대한 메시지 문자열 출력
System.out.println("getMessage(): " + e.getMessage());
// 예외의 원인 출력
System.out.println("getCause(): " + e.getCause());
// 클래스 이름 + ": " + 메시지 형태로 출력
System.out.println("toString(): " + e.toString());
System.out.println("printStackTrace(): ");
// 예외에 대한 간단한 설명 + 스택 트레이스 출력
e.printStackTrace();
}
}
}
public class Test {
public static void main(String args[]) {
// ArithmaticTest 객체 생성
ArithmaticTest test = new ArithmaticTest();
// 메소드 호출
test.division(20, 0);
}
}
실행 결과
getMessage(): / by zero getCause(): null toString(): java.lang.ArithmeticException: / by zero printStackTrace(): java.lang.ArithmeticException: / by zero at ArithmaticTest.division(Test.java:5) at Test.main(Test.java:27)
위 예제에서 20을 0으로 나누려다 ArithmeticException이 발생했으며, catch 블록에서 Throwable이 제공하는 다양한 메소드를 활용해 예외 정보를 확인하는 과정을 볼 수 있습니다. 이처럼 Throwable 클래스의 메소드들을 잘 활용하면 예외의 원인을 빠르게 파악하고 디버깅 효율을 크게 높일 수 있습니다.