자바 예외의 종류
자바는 오류 및 오류를 클래스로 관리하며 당연히 최상위 클래스인 Object를 상속받게 됩니다.
프로그램이 실행되다가 예기치 못한 상황이 발생시 JVM은 해당 상황에 맞는 예외를 만들어 던지게 됩니다.

오류 중 최상위 클래스는 Throwable 클래스인데 이름에서도 알 수 있듯이 throw(던지다) 와 able(~ 할 수 있는) 즉 던질 수 있다는 뜻을 가지고 있습니다.
따라서 Throwable을 상속받아야만 예외로서 던져질 수 있다는 것을 알 수 있습니다.

 

 

예외 상속 계층도
예외의 상속 계층도는 다음과 같으며 거의 대부분의 중요한 예외 및 에러는 java.lang 패키지에 포함되어 있습니다.
자바의 오류는 에러와 예외로 나뉘며, 예외는 또다시 컴파일 예외와 런타임 예외로 나뉩니다.
자바에서의 모든 예외는 이 틀을 벗어나지 않기 때문에 이 밖의 예외들은 이 규칙에 따라 사용하면 됩니다.

 

 

Throwable
예외와 에러를 추상화한 클래스로 모든 자바 예외 및 에러는 Throwable 클래스를 상속받습니다.
Throwable을 상속받지 않은 클래스는 JVM에서 오류로 인식하지 않기 때문에 던질 수 없습니다.
모든 예외는 Throwable 클래스를 상속하므로 Throwable 클래스가 가지고 있는 메서드는 모든 예외에서 사용 가능하다는 이야기입니다.

Throwable의 생성자 및 메서드를 간단하게 몇가지 알아보도록 하겠습니다.

생성자
message - 오류에 대한 상세 메세지입니다.
cause - 오류 발생의 원인이 되는 상세 예외를 생성자로 넘깁니다.

 

1
2
3
4
    Throwable throwable = new Throwable();
    Throwable throwable = new Throwable(String message);
    Throwable throwable = new Throwable(Throwable cause);
    Throwable throwable = new Throwable(String message, Throwable cause);
cs

 

메서드
String getMessage()예외에 대한 상세 메세지를 반환합니다.
Throwable getCause() - 예외가 발생한 근본적인 원인 예외를 반환합니다. 원인 객체가 없는 경우 null을 반환합니다.
void printStackTrace() - 예외가 발생할 당시의 현재 스레드에 대한 스택 정보를 표준 출력으로 출력합니다. 어떤 메서드가 호출되면서 예외가 발생한 것인지 알기위한 용도로 사용합니다.
void printStackTrace(PrintStream s)PrintStream을 통해 스택 정보를 출력합니다.
void printStackTrace(PrintWriter s) - PrintWriter를 통해 스택 정보를 출력합니다.
Throwable initCause(Throwable cause) - 현재 예외에 대한 원인이 되는 예외를 초기화시킵니다.
StackTraceElement[] getStackTrace() - 예외가 발생했을 당시의 스택정보를 StackTraceElement 배열로 반환합니다. StackTraceElement는 스택에 대한 요소들입니다.

Exception
에러가 아닌 예외들의 최상위 클래스입니다.
특별히 구현된 메서드는 없으므로 생성자와 메서드는 Throwable 생성자와 같습니다.

 

 

 

 


RuntimeException의 하위 예외 클래스
개발시 자주 만나게 되는 RuntimeException의 대표적인 하위 예외클래스들을 알아보도록 하겠습니다.
해당 예외들을 제외한 예외는 api 문서를 참고해 주시기 바랍니다.

ClassCastException
클래스 형 변환(캐스팅) 연산을 잘못 했을 때 발생한 예외입니다.
다음과 같이 String 객체를 상위 클래스인 Object형 obj 참조변수에 담은 후 Integer형으로 형변환 하려 하는 경우 발생합니다.
1
2
3
4
5
String str = "3";
Object obj = str;
Integer integer = (Integer)obj;
//Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Intege
 
cs

 

NullPointerException
null값을 갖는 참조변수를 통해 객체의 메서드를 접근하려 할 때 발생합니다.
str 변수에는 어떠한 문자열 객체도 할당되지 않아 null값을 갖습니다.
이때 str의 메서드인 equals 메서드를 사용하였기 때문에 예외가 발생합니다.
1
2
3
String str = null;
str.equals("test");
//Exception in thread "main" java.lang.NullPointerException
cs

 

ArithmeticException
산술연산과 관련된 예외입니다. 예를 들어 다음과 같이 정수를 0으로 나눌 때 발생합니다. (실수를 0으로 나누는 경우에는 발생하지 않음)
1
2
3
int a = 3 / 0;
 
//Exception in thread "main" java.lang.ArithmeticException: / by zero
cs

 

 

IndexOutOfBoundsException
배열의 범위를 벗어난 index를 참조할 때 발생하는 예외입니다. 
예를 들어 다음과 같이 배열의 index는 0부터 시작이기 때문에 index의 최대값은 2이지만 배열의 3번 index에 접근했기 때문에 예외가 발생합니다.
1
2
3
int[] iArr = new int[3];
iArr[3= 3;
//Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
cs

 

 

ArrayStoreException
int형 배열에 String 객체를 넣으려는 것과 같이 배열에 대해 부적절한 데이터 저장시 발생합니다.


NegativeArraySizeException
배열의 크기를 음수로 지정한 경우에 발생합니다.
1
2
int[] iArr = new int[-3];
//Exception in thread "main" java.lang.NegativeArraySizeException
cs

 

 

NumberFormatException
문자열을 숫자로 변환 시 숫자 형식에 맞지 않는 경우 발생합니다.
예를 들어 다음과 같이 "삼백" 이라는 문자열을 정수로 변환하려 했을 때 발생합니다.
"300" 은 변환이 가능하지만 "삼백"은 변환이 불가능 합니다.
1
2
3
String str = "삼백";
Integer num = Integer.parseInt(str);
//Exception in thread "main" java.lang.NumberFormatException: For input string: "삼백"
cs

 

 

블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

,