언어 공부/Java

예외처리(Exception handling)

까루카라 2024. 1. 3. 13:00

프로그램 오류

1. 컴파일 에러 : 컴파일 시에 발생하는 에러

2. 런타임 에러 : 실행 시에 발생하는 에러

3. 논리적 에러 : 실행은 되지만, 의도와 다르게 동작하는 것

 

 

에러와 예외

1. 에러(error) : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류

2. 예외(exception) : 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류

 

 

오류 클래스 계층 구조

Object 

ㄴ Thorowable

ㄴㄴException / Error

Exception 

ㄴ RuntimeException, IOException ...

Error

ㄴ OutOfMemoryError ...

 

예외 클래스는 두 가지로 구분할 수 있다. 

1. Exception클래스와 그 자손들(RuntimeException 클래스와 그 자손들 제외) : Exception 클래스들

2. RuntimeException 클래스와 그 자손들 : RuntimeException 클래스들

 

Exception 클래스들 : 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외

RuntimeException 클래스들 : 프로그래머의 실수로 발생하는 예외

 

예외 처리하기

예외 처리 : 프로그램 실행시 발생할 수 있는 예외에 대비한 코드를 작성하는 것

→ 프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것

 

예외를 처리하지 못하면, 프로그램은 비정상 종료되며,

처리되지 못한 예외는 JVM의 '예외처리기'가 받아서 예외의 원인을 출력

 

try-catch문

try {
	// 예외가 발생할 가능성이 있는 문장들
} catch (Exception1 e1) {
	// Exception1이 발생했을 경우, 이를 처리하기 위한 문장들을 적는다. 
} catch (Exception2 e2) {
	// Exception2이 발생했을 경우, 이를 처리하기 위한 문장들을 적는다. 
} catch (Exception3 e3) {
	// Exception3이 발생했을 경우, 이를 처리하기 위한 문장들을 적는다. 
}

 

try 다음에는 여러 종류의 예외를 처리할 수 있는 하나 이상의 catch 블럭이 온다. 

이 중 발생한 예외의 종류와 일치하는 단 한 개의 catch 블럭만 수행된다. 

발생한 예외의 종류와 일치하는 catch블럭이 없으면 예외는 처리되지 않는다. 

 

 

예외가 발생하면  발생한 예외에 해당하는 클래스의 인스턴스가 만들어진다. 

catch 블럭들을 차례로 내려가면서

catch 블럭의 괄호 내에 선언된 참조변수의 종류와 생성된 예외클래스의 인스턴스에 instanceof 연산자를 사용해서 검사

true인 catch 블럭을 찾게 되면 블럭의 모든 문장을 수행 후 try-catch 문을 빠져나간다. 

true인 catch 블럭이 없으면 예외는 처리되지 않음 

 

예외 클래스는 Exception 클래스의 자손이므로

Exception 클래스 타입의 참조변수를 선언해놓으면 모든 예외 처리 가능

 

 

printStackTrace() : 예외발생 당시의 호출스택에 있었던 메서드의 정보와 예외 메시지를 화면에 출력한다. 

getMessage() : 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있다. 

 

멀티 catch 블럭

catch 블럭의 괄호안에 참조변수를 | 기호로 여러 타입의 클래스로 선언할 수 있다. 

단, 예외 클래스들이 조상과 자손 관계에 있으면 오류 발생 (조상만 써주는 것과 똑같기 때문에)

어떤 예외가 잡혀서 실행됐는지 알 수 없어서 클래스들의 공통 분모인 조상 예외 클래스에 선언된 멤버만 사용할 수 있다. 

 

예외 발생시키기

1. 먼저, 연산자 new를 이용해서 발생시키려는 예외 클래스의 객체를 만든다.

Exception e = new Exception("String");  ※ String은 getMessage의 메시지로 저장됨

2. 키워드 throw를 이용해서 예외를 발생시킨다. 

throw e;

 

// 컴파일러가 예외처리를 확인하는 Exception 클래스 : 'checked 예외'
// 컴파일러가 예외처리를 확인하지 않는 RuntimeException 클래서 : 'unchecked 예외'

 

 

메서드에 예외 처리하기

void method() throws Exception1, Exception2, ... ExceptionN {
	// 메서드 내용
}

 

메서드의 선언부예 예외를 선언 → 이 메서드를 사용하기 위해서 어떠한 예외들이 처리되어져야 하는지 쉽게 파악할 수 있다. 

메서드에 예외를 선언할 때 일반적으로 RuntimeException 클래스들은 적지 않는다. 반드시 처리해야 하는 것은 아니기 때문