티스토리 뷰

언어/Java

[Java]에러(Error)와 예외(Exception)에 대하여

꼬마우뇽이(원종운) 2022. 1. 2. 15:17

오류(Error)란

오류는 시스템이 종료되어야 할 수준 문제, 메모리 부족(OutOfMemoryError) 또는 스택오버플로우(StackOverflowError)와 같은 개발자가 수습할 수 없는 심각한 경우를 말합니다.

 

예외(Exception)란

예외는 오류처럼 수습할 수 없는 경우가 아니라 개발자가 예측하고 예외 처리(Exception Handling)를 통하여 시스템이 종료되는 것을 막을 수 있는 경우를 말합니다.

 

오류와 예외의 계층구조

Java에서는 오류와 예외를 구분하여 위와 같은 계층 구조를 만들어두었다. 그러면 뜬금없는 Error 클래스와 Exception 클래스의 부모 클래스인 Throwable 클래스는 무엇일까요?

 

Throwable 클래스

공식문서에 의하면 Throwable 클래스는 생성 당시 쓰레드의 실행 스택에 대한 스냅샷에 대한 정보, 발생한 오류나 예외에 대한 메시지를 기록을 한다고 적혀있습니다. 그 밖에도 다양한 정보들을 보관(기록) 하고 있습니다. 대표적인 두 정보를 가져올 수 있는 메서드에 대해서 알아보도록 하겠습니다.

 

getStackTrace() 메서드 - 생성 당시 쓰레드의 실행 스택에 대한 정보

public class Throwable implements Serializable {
	public StackTraceElement[] getStackTrace() {
		return getOurStackTrace().clone();
	}
}

 

getMessage() 메서드 - 발생한 오류나 예외에 대한 메시지

public class Throwable implements Serializable {

	private String detailMessage;
    
	public String getMessage() {
		return detailMessage;
	}
}

 

예외 처리를 위해 Java에서 제공하는 throw, try-catch 문과 관련된 설명도 찾아볼 수 있습니다.

 

throw 문으로 전달할 수 있는 객체는 Throwable 클래스 또는 해당 하위 클래스의 객체들만 전달할 수 있으며 try-catch 문의 catch 절에의 인수 또한 Throwable 클래스 또는 해당 하위 클래스만 올 수 있습니다.

 

사용

public class App {

  public static void main(String[] args) throws IOException {
    try {
    	throw new Throwable("예외가 발생한 이유입니다.");
    } catch (Throwable ex) {
    	System.out.printf("[예외 메시지] : %s\n", ex.getMessage());
    	// 결과 : [예외 메시지] : 예외가 발생한 이유입니다.
    	System.out.printf("[실행 스택] : %s\n", ex.getStackTrace()); 
    	// 결과 : [실행 스택] : com.example.study.App.main(App.java:11)
    }
  }
}

 

Checked Exception과 UnChecked Exception이란?

기존의 Exception 들을 Checked Exception과 UnChecked Exception으로 어떻게 나눴는지, 왜 나눴는지, 무엇이 다른지를 알아보도록 하겠습니다.

 

어떻게 나눴는가?

공식 문서에 의하면 Throwable 클래스, RuntimeExcetpion 클래스 또는 Error 클래스의 하위 클래스가 아닌 모든 Throwable의 하위 클래스들을 Checked Exception이라고 하며 RuntimeException 클래스 또는 RuntimeException의 하위 클래스들을 UnChecked Exception이라고 합니다.

 

간단하게 요약하면 다음과 같습니다.

 

예외 설명
Checked Exception Throwable 클래스, Exception 클래스, Exception 클래스의 하위 클래스, Error 클래스도 공식 문서에 의하여 포함되지만, Exception이 아니기때문에 제외하였습니다.
UnChecked Exeption RuntimeException 클래스, RuntimeException 클래스의 하위 클래스

 

왜 나눴는가?

개발자의 실수(또는 고의)로 발생하는 예외와 클라이언트의 잘못이나 외부의 요인에 의해 발생하는 예외를 구분하여 처리하고자 나눴습니다. 

 

무엇이 다른가?

Checked Exception과 UnChecked Exception은 접두사에서 알 수 있듯이 예외 처리를 필수적으로 해야(Check)하는지 여부가 다릅니다.

 

예외 예외처리 여부
Checked Exception 프로그램 외부의 요인에 의해 발생된 것이기때문에 필수적으로 처리해야한다.
(만약 해당 메서드를 호출하는 곳으로 책임을 넘기고 싶다면 throws 절에 명시하면 된다.)
UnChecked Exception 개발자의 실수(또는 고의)로 발생된 것이기때문에 예외 처리에 대한 책임을 개발자에게 맡기므로 필수로 처리하지 않아도 된다.

 

마무리

예외 처리에 있어서 중요한 점은 Exception을 Checked Exception과 Checked Exception으로 어떻게 나눴는지, 왜 나눴는지, 무엇이 다른지를 정확히 인지하고 프로그램 개발에 있어서 발생할 수 있는 예외를 처리해주는 것 같다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함