예외 처리 (Exception Handling)

  • 예외(Exception): 프로그램 실행 중 비정상적으로 발생환 상황

  • 예외 처리(Exception Handling): 예외를 처리하여 프로그램이 정상적으로 동작하도록 하는 것

  • C++에서는 try ... catch 구문을 사용하여 예외를 처리함.

try {
    if (예외 조건)
        throw 예외 객체;
} catch (예외 객체) {
    예외 처리
}
  • try { } 와 catch { } 는 하나로 사용되어야 함.

    • try 블록에서 처리할 예외를 정의.

    • catch 블록에서 발생한 예외를 처리.

  • throw 키워드는 예외를 고의적으로 발생시키는 것.

  • 예외가 발생하는 상황: 0으로 나누기 등

#include <iostream>
using namespace std;

int main() {
    int a = 9, b = 0, c = a / b;
    cout << c << endl;
    return 0;
}

/*
$ g++ test.cpp
$ ./a.out
[1]    1884 floating point exception  ./a.out
 */
  • 예외 처리를 try ... catch 구문으로 하지 않으면 if 문을 사용해야 하므로, 조건문과 예외 처리 코드가 구분되지 않음. 가독성이 떨어짐.

#include <iostream>
using namespace std;

int main() {
    int a = 9, b = 0, c = 0;
    if (b != 0) {
        c = a / b;
        cout << c << endl;
    } else {
        cout << "Exception: Divide by zero" << endl;
    }
    return 0;
}
  • 예외 처리만 명확하게 구분하기 위해 반드시 예외는 try ... catch 구문으로 처리해야 함.

#include <iostream>
using namespace std;

int main() {
    int a = 9, b = 0, c = 0;
    try {
        if (b == 0) throw b;
        c = a / b;
        cout << c << endl;
    } catch (int divided) {
        cout << "Exception: Divide by " << divided << endl;
    }
    return 0;
}

/*
$ g++ test.cpp
$ ./a.out
Exception: Divide by 0
 */
  • 예외가 둘 이상일 경우 catch 를 여러 개 사용해서 처리할 수 있음.

try {
    if (예외 조건1)
        throw 예외 객체1;
    if (예외 조건2)
        throw 예외 객체2;
} catch (예외 객체1) {
    예외 처리
} catch (예외 객체2) {
    예외 처리
}
  • 함수를 사용해서 예외 처리를 할 경우

#include <iostream>
#include <string>
using namespace std;

int divide(int a, int b) {
    if (b == 0)
        throw string("Divide by zero");
    return a / b;
}

int main() {
    int a = 9, b = 0, c = 0;
    try {
        c = divide(a, b);
        cout << c << endl;
    } catch (string msg) {
        cout << "Exception: " << msg << endl;
    }
    return 0;
}
  • throw와 noexcept 키워드로 함수의 예외 처리 범위를 지정할 수 있음.

    • void func(int a); 모든 타입의 예외가 발생 가능.

    • void func(int a) throw(int); 정수형 타입 예외만 던질 수 있음.

    • void func(int a) throw(char *, int); 둘 이상의 타입으로 예외를 던질 때는 쉼표(,)로 나열.

    • void func(int a) throw(); 예외가 발생하지 않음.

    • void func(int a) noexcept; 예외가 발생하지 않음 (C++11 style)

 

표준 예외 클래스 (Standard Exception Class)

  • C++에서는 자주 발생하는 예외에 대해 미리 정의한 클래스를 제공함.

  • 각각의 예외별로 다른 header 파일에 정의되어 있지만, <exception> 헤더 파일을 포함하면 대부분 사용 가능.

  • 대표적인 표준 예외 클래스

    • bad_alloc 메모리 할당 오류로서 new 연산에서 발생 #include <new>

    • bad_cast 형변환 오류로서 dynamic_cast에서 발생 #include <typeinfo.h>

    • bad_type_id typeid에 대한 피 연산자가 널 포인터인 경우 발생

    • bad_exception 예기치 못한 예외로서 함수 발생 목록에 있지 않는 예외

    • bad_logic_error 클래스 논리 오류

    • invalid_argument, length_error, out_of_range 의 기본 #include <stdexcept>

    • runtime_error 실행 오류로 overflow_error와 underflow_error의 기본 #include <stdexcept>

#include <iostream>
#include <new>
using namespace std;

int main () {
    try {
        int* arr= new int[10000000000000000];
        delete[] arr;
    } catch (bad_alloc& ba) {
        cerr << "bad_alloc caught: " << ba.what() << endl;
    }
    return 0;
}

/*
$ ./a.out
a.out(7097,0x117dcadc0) malloc: can't allocate region
:*** mach_vm_map(size=40000000000000000, flags: 100) failed (error code=3)
a.out(7097,0x117dcadc0) malloc: *** set a breakpoint in malloc_error_break to debug
bad_alloc caught: std::bad_alloc
 */

 

스택 풀기 (Stack Unwinding)

  • 예외가 발생했을 때 catch 를 사용하지 않으면 해당 함수를 호출한 위치로 예외를 전달함.

  • 함수 호출 시 정보를 스택에 저장하므로, catch를 만날 때까지 스택에서 함수 정보를 하나씩 꺼내면서 찾아감.

  • 예외 처리를 하기 위해 발생 지점부터 처리 위치까지 스택에서 함수를 소멸시키면서 이동.

#include <iostream>
using namespace std;

void fn1() { throw 0; }
void fn2() { fn1(); }
void fn3() { fn2(); }
void fn4() { fn3(); }

int main () {
    try {
        fn4();
    } catch (int e) {
        cout << "Exception: " << e << endl;
    }
    return 0;
}

/*
$ ./a.out
Exception: 0
 */

 


 

Exception Event

 

예외(Exception) : Exception Event의 약자로, 프로그램의 실행 중에 발생하는 이벤트로서 프로그램의 정상적인 실행 흐름을 중단시킨다. , 자바에서 발생하는 오류를 의미한다.

 

예외 객체(Exception Object) : 메소드 안에서 오류가 발생하면 메소드가 자바 런타임 시스템으로 넘기는 객체로, 발생된 오류를 설명한다. 이 객체는 오류의 타입과 오류 발생 시의 프로그램의 상태 등의 정보를 포함하고 있다.

 

예외 던지기 : 예외 객체를 생성하는 것을 표현하는 말이다.


- 예외 잡기 : 예외 객체를 처리하는 것을 표현하는 말이다.



 

 

 

예외 처리기

 

예외가 발생한 지점 이후의 문장들은 실행되지 않는다. 그러나 프로그램 실행 상태를 유지하기 위해 예외가 발생하는 즉시 프로그램을 종료하지 않고, 예외를 처리하는 방법을 자바에서 제공한다.

 

예외 처리기의 기본 형식

  • 예외가 발생했을 경우 : try → catch ( finally)

  • 예외가 발생하지 않았을 경우 : try ( finally)

try {

//예외가 발생할 것 같은 코드

} catch(예외타입명 참조변수명) { //예외의 최상위 객체는 Exception 이다.

//예외를 처리하는 코드

} finally {

// try 또는 catch 블록이 끝나면 무조건 시작하는 코드로, 해당 블록은 생략할 수 있다.

}


- trycatch 블록은 별도의 독립된 블록이므로 try 블록에서 선언된 변수는 catch 블록에서 사용할 수 없다.


예제 : 0으로 나누는 경우

public class DivideByZero {
	public static void main(String[] args) {
		int x = 10;
		int y = 0;

		try {
			int reault = x/y;
		} catch(ArithmeticException e) { // Arithmetic 은 “산술”의 의미를 가진다.
			System.out.println(“0으로 나눌 수 없습니다.”);
		}

		System.out.println(“프로그램 진행중”);
	}
}

[ 출력 결과 ]


출력 결과를 보면, 예외가 발생하더라도 예외 처리를 통해 프로그램이 종료되지 않고 계속 실행되는 것을 볼 수 있다. 하나의 예제를 또 살펴보자.


예제 : 배열에서 인덱스가 배열의 크기를 벗어나는 경우

public class ArrayException {
	public static void main(String[] args) {
		int[] array = {1, 2, 3, 4, 5};
		int i = 5;
		
		try {
			int result = array[5];
		} catch (ArrayIndexOutOfBoundsException e) {
			System.out.println("array 배열은 0~4까지의 인덱스를 가지므로 인덱스 5는 참조불가");
		}

		System.out.println("프로그램 진행중");
	}
}

 [ 출력 결과 ]


배열의 인덱스가 4가 마지막인데 5번 인덱스를 찾으면 위처럼 ArrayIndexOutOfBoundsException이 발생하게 된다. 그러나 예외 처리를 통해 프로그램이 여전히 실행 중인 것을 볼 수 있다.



- 예외 처리를 하는 목적 : 오류 처리 코드 즉, 오류가 발생할 수 있는 코드를 안전하고 정상적인 코드와 분리할 수 있다. 제일 중요한 것은 오류가 나지 않게 코딩을 하는 것이다. 하지만 초보 개발자에겐 어렵기 때문에 예외 처리를 꼼꼼히 하는 것이 좋다.

 

 

 

finally 블록

 

- finally 블록은 try-catch 블록이 종료될 때 반드시 실행된다.

 

- finally 블록을 사용하는 이유는 자원 정리를 하지 않고 try-catch 블록을 종료하는 것을 방지하기 위함이다.

 

자원을 정리한다는 것은 파일이나 메모리와 같은 자원을 반납하는 코드를 사용하는 것을 말한다. 따라서 이와 같은 코드는 finally 블록 안에 작성하는 것이 좋다.

 

- finally 블록을 적절하게 사용하면 자원의 누출을 막을 수 있다.


- 예제 : 파일 작성하기

public class FileError {
	private int[] intArray;
	private static final int SIZE = 10;
	 
	public FileError() {
		intArray = new int[SIZE];
		for(int i = 0; i < SIZE; i++) {
			intArray[i] = i;
		}
		writeList();
	}
	 
	public void writeList() {
		PrintWriter out = null; //PrintWriter란 파일에 데이터를 기록하는 출력 스트림 객체이다.
	 
		try {
			out = new PrintWriter(new FileWriter("file.txt"));
			for(int i = 0; i < SIZE; i++) {
				out.println("배열 원소 " + i + " = " + intArray[i]);
			}
		} catch (ArrayIndexOutOfBoundsException e) { //배열 인덱스 오류 발생 시 실행
			System.err.println("ArrayIndexOutOfBoundsException : ");
		} catch (IOException e) {//입출력 오류 발생 시 실행
			System.err.println("IOException : ");
		} finally {
			if(out != null) {
				System.out.println("finally 블록에서 자원 정리");
				out.close();
			}
		}
	}
	 
	public static void main(String[] args) {
		new FileError();
	}
}

[ 출력 결과 ]


정상적으로 파일이 생성되었으며, 자원 정리까지 마친 모습이다.


디렉토리 경로를 서술할 때 "file.txt" 처럼 파일명만 적게 되면 프로젝트 폴더(Chapter) 아래에 파일이 생성된다. 즉, 작업 디렉토리 아래에 파일이 생성되는 것이다. 



파일의 내용 또한 정상적으로 기재되었다.



 

 

try-with-resources 문장

 

하나 이상의 자원을 선언하는 try 문장이다. 즉, 메모리 공간을 빌려 쓰는 등의 경우가 무조건 있다면! try-with-resource 문장을 사용하는 것이 자원을 반납하는데 용이하다.

 

자원은 프로그램이 종료되면서 반드시 반납해야 하는데, try-with-resources 문장은 문장의 끝에서 자원들을 자동으로 반납할 수 있게 한다.

 

- Java SE 7버전부터 추가되었다.


- 아래의 예시는 readList() 메소드에서 예외가 발생하면 해당 메소드를 호출한 곳으로 예외를 던지는 경우이다. 즉, 메소드 내에서 예외를 처리하지 않는다.

  • 이 기능을 사용하려면 자원 객체가 java.lang.AutoCloseable 인터페이스를 구현하여야 한다. Java SE 7버전부터 BufferedReader 클래스가 이 인터페이스를 구현하고 있다. 

static String readList() throws IOException {

try (BufferedReader br = new BufferedReader(new FileReader(“file.txt”)) {

return br.readLine();

}

}

 

- try 키워드 바로 다음에 소괄호가 있으면 소괄호 안의 내용을 자원으로 취급한다.

 

- try 문장이 정상적으로 종료되건 예외가 발생하건 간에 무조건 자원은 닫힌다.


 

 

 

예외 처리

 

예외는 하나의 객체이다.


예외의 종류는 크게 3가지가 있다.

  • Error

  • RuntimeException

  • 기타 예외

예외의 종류에 따라 처리되지 않아도 되는 예외도 존재한다.

 

모든 예외는 Throwable 클래스로부터 상속되어서 ErrorException 이라고 하는 두 개의 클래스로 나누어진다Exception은 다시 RuntimeException과 기타 예외로 나누어진다.


- Error : 자바 가상 기계 안에서 치명적인 오류가 발생하면 생성된다.

  • 대부분의 애플리케이션은 이러한 오류를 예측하거나 복구할 수 없다. 예를 들어, 하드웨어의 오류로 파일을 읽을 수 없는 경우가 있는데, 이런 경우 IOError가 발생한다.

  • Error는 자주 발생하지 않으며, 예외 처리 대상이 아니다. 따라서 컴파일러는 체크하지 않는다.

 

- RuntimeException : 주로 프로그래밍 버그나 논리 오류에서 기인한다

  • 예를 들어 파일 이름을 FileReader 생성자로 전달하는 과정에서 논리 오류로 항상 null값을 전달한다면 생성자가 NullPointerException을 발생한다애플리케이션은 이러한 예외를 물론 잡아서 처리(예외 처리기)할 수 있지만 보다 합리적인 방법은 예외를 일으킨 버그를 잡는 것이다.

  • RuntimeException은 예외 처리의 주된 대상이 아니므로 컴파일러가 체크하지 않는다.

 

- ErrorRuntimeException을 합쳐서 비체크 예외(unchecked exceptions)라고 한다.

 

기타 예외 : 체크 예외(checked exception)라고 하며, 충분히 예견될 수 있고 회복할 수 있으므로 프로그램은 반드시 이 예외들을 처리하여야 한다.

  • 예를 들어 애플리케이션이 사용자에게 입력 파일 이름을 받아서 파일을 오픈하는 상황이 있다면, 정상적인 작동에 의해 사용자가 이미 존재하는 파일 이름을 입력하고 FileReader 객체가 생성될 것이다. 그러나 실수로 잘못된 파일의 이름을 입력한 경우 FileNotFoundException 예외가 발생한다. 이 때 프로그램이 실행 중단되길 바라는 게 아니라, 예외 처리의 주된 대상으로 보고 예외를 잡아서 다시 사용자에게 정확한 파일 이름을 받게 해야 한다.

  • 기타 예외는 컴파일러가 예외를 처리했는지 확인한다. 만약 처리하지 않았다면 컴파일 오류가 발생한다.


- 예외의 포괄적 처리 : 예외도 객체임은 앞서 설명했었다. 따라서 처리할 때 상위 클래스를 이용하여 하위 클래스까지 포괄적으로 처리할 수 있다.

 

try {

getInputExample(); //이 함수에 예외가 발생한다고 가정하자.

} catch (NumberException e) { //NumberException 의 하위 클래스를 모두 잡는다.

//예외 처리 코드

}


위의 방법 외에도 예외의 최상위 클래스인 Exception을 예외종류로 catch 소괄호에 선언 catch (Exception e) 하면 모든 예외를 잡을 수 있다. 그러나 어떤 예외가 발생했는지 분간할 수 없다. 그러므로 구체적인 클래스 이름을 먼저 쓰고 일반적인 클래스 이름(상위 클래스)은 나중에 쓰는 것이 좋다. , catch 블록을 사용할 때는 하위 클래스부터 상위 클래스 순서로 작성하여야 한다.

 

 

 

예외와 메소드

 

자바에서는 예외를 처리하는 방법이 크게 두 가지가 있다.

  • 예외를 잡아서 그 자리에서 처리하는 방법 : try-catch 블록 사용

  • 메소드가 예외를 발생시킨다고 기술하는 방법 : throws 키워드 사용하여 다른 메소드한테 예외 처리 맡기기

- “메소드가 예외를 발생시킨다고 기술하는 방법은 가끔 메소드가 발생되는 예외를 그 자리에서 처리하지 않고, 자신을 호출한 상위 메소드로 예외를 전달하는 편이 더 적절할 때 사용된다.


 이와 같은 방식을 사용하는 이유는 발생하는 모든 예외를 그 자리에서 처리하는 것은 상당한 양의 코드를 필요로 하고 또 반드시 상위 메소드가 그 예외를 처리하도록 해야 하는 경우도 있기 때문이다.

 

상위 메소드가 예외를 처리하도록 하려면, 반드시 메소드가 이들 예외를 던진다고 메소드 정의에 표시하여야 한다.

 

public void writeList() throws IOException {

...

}

 

비체크 예외는 상위 메소드로 전달하지 않아도 된다. 그러나 기술할 수는 있다.

 

public void writeList() throws IOException, ArrayIndexOutOfBoundsException {

...

}

 

보통 RuntimeException은 비체크 예외지만, 프로그램의 다른 영역으로 넘기지 말고 직접 처리해야 한다.

 

계속 언급해온 예외 처리라는 것은 정확하게 실제 발생한 예외의 종류와 예외 처리기가 처리하기로 한 예외의 종류가 일치하는 것을 의미한다.

 

예외 처리 과정


 어떤 메소드 안에 예외가 발생하면 런타임 시스템은 그 메소드 안에 예외 처리기가 있는 지를 살핀다. 만약 그 자리에 예외 처리기가 없다면 호출 스택(call stack)에 있는 상위 메소드를 조사하게 된다. 


 즉, 탐색은 예외가 발생한 메소드부터 시작하여서 메소드가 호출된 순서의 역순으로 진행된다. 아래의 과정 중 예외가 전달되는 상황에서 호출 스택을 탐색하게 되는 것이다.

 

예외가 발생한다. 예외가 전달된다. 예외를 잡는다.

 

 만약 전체 호출 스택을 런타임 시스템이 다 뒤졌는데도 처리기를 발견하지 못하면 그냥 프로그램을 종료시킨다.

 

 호출 스택은 메소드의 호출 순서를 기억하며, 지금까지 호출된 메소드를 스택에 모아놓는다. 호출 스택이 있어야만 메소드가 종료되었을 경우, 되돌아갈 메소드를 찾을 수 있다.

 

 

 

예외 생성하기

 

예외는 주로 자바 라이브러리에서 많이 발생하지만 실제로는 어떤 코드라도 예외를 발생시킬 수 있다.

 

자바에서는 예외 객체를 생성하는 키워드를 throw 라고 한다.

 

- throws는 예외를 던지는 키워드이고, throw는 예외 객체를 생성하는 키워드임에 주의해야 한다.

 

자바에서는 오류가 감지되면 throw 문을 사용하여 예외를 생성한다.

 

- throw 문장은 Throwable 객체만 하나의 인수로 요구한다. Throwable 객체는 Throwable 클래스를 상속받는 자식 클래스들의 인스턴스(객체)이다. 예외를 던질 때는 예외를 다중으로 던질 수 있지만 예외를 생성할 때는 throw 키워드 하나에 오직 하나의 예외만 생성할 수 있는 것이다.

 

- catch 블록에서 예외를 처리하지 못하거나 다른 예외 처리기로 작업을 위임할 경우에는 예외를 다시 발생시켜서 전달할 수도 있다. , 연속적인 예외가 발생하는 것이다


 단아래에 서술한 ExampleException은 예시이므로 실제로 생성할 예외 클래스는 미리 정의되어 있어야 한다.


try {

...

} catch (IOException e) {

throw new ExampleException(“다른 예외”, e);

}


 새로운 예외 객체에는 원래의 예외 객체가 첨부된다. 즉, 위에는 ExampleException과 IOException이 서로 세트처럼 붙어 다니게 된다. 따라서 이 두 개를 모두 처리할 수 있는 올바른 처리기를 만날 때까지 자바 런타임 시스템은 메소드 호출 스택을 거슬러 올라가며 탐색한다.

 

 

 

사용자 정의 예외

 

다른 예외와 구별하여 특별히 처리하려는 오류가 있다면 사용자 정의 예외 클래스를 생성한다.

 

- Exception 클래스를 상속하여 만든다.

 

public class MyException extends Exception {

...

}

 







1. 패러다임

- 객체 지향 프로그래밍(Object-Oriented Programming)

- 구조적 프로그래밍(Structured Programming)

- 절차적 프로그래밍(Imperative Programming)


2. JRE : Java Runtime Environment 

- 자바 프로그램을 실행하기 위한 라이브러리, 자바 가상 기계, 기타 컴포넌트들을 제공한다.

- 자바 프로그램을 단순히 실행만 하고 개발은 하지 않는 일반인들을 위한 환경이다.


3. JDK : Java Development Kit (자바 개발 도구)

- JRE에 추가로 자바 프로그램을 개발하는데 필요한 컴파일러, 디버거와 같은 명령어행 개발 도구를 추가한 것이다.


4. 오류

- 컴파일 오류 : 컴파일 시에 발견되는 오류


- 구문 오류(Syntax error) : 문법 규칙에 어긋날 경우 생기는 오류


- 의미 오류(Semantic error) : 계산식에서 호환되지 않는 서로 다른 타입의 데이터에 대해 계산을 시도할 경우 발생하는 오류


- 논리 오류 : 프로그램이 실행되어도 의도하지 않는 결과를 발생하는 오류. 디버깅(Debuugging)을 통해 논리 오류를 찾고 수정한다.


- 실행 오류 : 프로그램이 실행되는 도중에 발생하는 오류. 자바에서는 예외(Exception)를 사용하여 실행 오류를 처리한다.



5. Exception(예외)의 종류와 발생원인


 Exception 종류

발생 원인 

ClassNotFoundException

클래스를 발견하지 못함

CloneNotSupportedException

Cloneable 인터페이스 미구현

IllegalAccessException

클래스 접근을 못함

InstantiationException

추상 클래스나 인터페이스 인스턴화

InterruptedException

쓰레드가 중단 되었을때

NoSuchFieldException

지정된 필드가 없을때

NoSuchMethodException 

지정된 메소드가 없을때

(IOException) CharConversionException 

문자 변환에서 예외가 발생했을때

(IOException) EOFException

파일의 끝에 도달했을때

(IOException) FileNotFoundException

파일을 발견하지 않았을 때

(IOException) InterruptedIOException

입출력 처리가 중단되었을 때

(IOException) (ObjectStreamException) InvalidClassException

클래스 내부의 serialize 처리 문제 발생

(IOException) (ObjectStreamException) InvalidObjectException

 serialize 오브젝트에서 입력 검증 실패

(IOException) (ObjectStreamException) NotActiveException

스트림 환경이 Active하지 않는데 메소드를 호출한 경우

(IOException) (ObjectStreamException) NotSerializableException

오브젝트를 serialize할 수 없을 때

(IOException) (ObjectStreamException) OptionalDataException

오브젝트 읽을 때 예상밖의 데이터가 있을 경우

(IOException) (ObjectStreamException) StreamCorruptedException

읽은 데이터 스트림이 파손되어 있을때

(IOException) (ObjectStreamException) WriteAbortedException

기록중 예외 발생한 스트림 읽은 경우

(IOException) SyncFailedException

FileDescriptor.sync() 호출 실패 시

(IOException) UnsupportedEncodingException

지정된 문자 부호화 형식 지원안할 때

(IOException) UTFDataFormatException

부정한 UTF-8방식의 문자열 만날 시

(RuntimeException) ArithmeticException

제로제산 등의 산술 예외 발생 시

(RuntimeException) ArrayStoreException

배열에 부정한 형태의 오브젝트 저장

(RuntimeException) (IllegalArgumentException) IllegalThreadStateException

쓰레드가 요구를 처리하기에는 부적합한 상태일 때

(RuntimeException) (IllegalArgumentException) NumberFormatException

부적절한 문자열을 수치로 변환할 때

(RuntimeException) IllegalMonitorStateException

모니터 상태가 부정일때

(RuntimeException) IllegalStateException

메소드가 요구를 처리하기에는 부적합한 상태일 때

(RuntimeException) (IndexOutOfBoundException) ArrayIndexOutOfBoundsException

범위 밖의 배열 첨자 지정 시

(RuntimeException) (IndexOutOfBoundException) StringIndexOutOfBoundsException

범위 밖의 String 첨자 지정시

(RuntimeException) NegativeArraySizeException

배열 크기를 음수로 지정한 경우

(RuntimeException) NullPointerException

null 오브젝트에 접근한 경우

(RuntimeException) SecurityException

보안 위반

(RuntimeException) UnsupportedOperationException

지원하지 않는 메소드 호출

 Error 종류

생원인 

(LinkageError) ClassCircularityError

클래스 초기화중에 순환 참조를 검출시

(LinkageError) (ClassFormatError) UnsupportedClassVersionError

JVM이 지원되지 않는 버전의 클래스 파일을 읽고자 할때

(LinkageError) ExceptionInInitializerError

정적 이니셜라이저로 예외가 발생

(LinkageError) (IncompatibleClassChangeError) AbstracMethodError

추상 메소드를 호출했을때

(LinkageError) (IncompatibleClassChangeError) IllegalAccessError

접근 불가능한 메소드와 필드 사용 시

(LinkageError) (IncompatibleClassChangeError) InstantiationError

추상클래스나 인터페이스 인스턴스화

(LinkageError) (IncompatibleClassChangeError) NoSuchFieldError

지정한 필드가 존재하지 않을 때

(LinkageError) (IncompatibleClassChangeError) NoSuchMethodError

지정한 메소드가 존재하지 않을 때

(LinkageError) NoClassDefFoundError

클래스 정의가 발견되지 않았을 때

(LinkageError) UnsatisfiedLinkError

클래스에 포함된 링크 정보를 해결하지 못할 때

(LinkageError) VerifyError

클래스 파일안에 부적절한 부분이 있을때

ThreadDeath

쓰레드가 정지해야만 한다는 의미

(VirtualMachineError) InternalError

내부 에러

(VirtualMachineError) OutOfMemoryError

메모리부족으로 메모리를 확보 못함

(VirtualMachineError) StackOverflowError

스택 오버 발생

(VirtualMachineError) UnknownError

심각한 예외 발생


[출처] http://silverbullet.tistory.com/entry/Exception%EC%9D%98-%EC%A2%85%EB%A5%98%EC%99%80-%EB%B0%9C%EC%83%9D%EC%9B%90%EC%9D%B8


+ Recent posts