good_da22 's devLog

Java

예외(Exception) 1

good_da22 2022. 7. 26. 23:39

Exception handling


프로그램 오류


프로그램이 실행 중 어떤 원인에 의해서 오작동을 하거나 비정상적으로 종료되는 경우

프로그램 에러 또는 오류

  • 컴파일 에러
    • 컴파일 시 발생하는 에러
  • 런타임 에러
    • 실행 시 발생하는 에러
  • 논리적 에러
    • 실행은 되나, 의도와 다르게 동작

실행 시(runtime) 발생하는 프로그램 오류를 심각도에 따라 두 가지로 구분

  • 에러(error)
    • 프로그램 코드에 의해 수습될 수 없는 심각한 오류
    • 메모리 부족, stack overflow 와 같이 발생하면 복구할 수 없다
    • 디버깅 필요

  • 예외(exception)
    • 프로그램 코드에 의해서 수습될 수 있는 미약한 오류
    • 발생하더라도 수습 가능

예외 처리(exception handling)

예외 발생 시 프로그램의 비 정상 종료를 막고 정상적인 실행 상태를 유지하는 것

예외 감지 및 발생 시 동작할 코드 작성

발생한 예외를 처리하지 못하면, 프로그램은 비정상적으로 종료

처리되지 못한 예외(uncaught exception) 는 JVM의 예외 처리기(UncaughtExceptionHandler) 가 받아서 예외 원인을 출력



예외 클래스 계층


발생 가능한 오류(exception or error)를 클래스로 정의

Object 클래스의 자손


exception 클래스를 두 그룹으로 구분

  • checked exception
    • Exception 클래스와 그 자손, RuntimeException 클래스와 그 자손 제외
    • 사용자의 실수 같은 외적인 요인에 의해 발생되는 예외
    • 예외에 대한 대처 코드가 없으면 컴파일 진행 불가

  • unchecked exception
    • RuntimeException 클래스와 그 자손
    • 프로그래머의 실수로 발생하는 예외
    • 예외에 대한 대처 코드가 없어도 컴파일 진행 가능
    • 컴파일 시점에서는 오류로 잡지 않는다.



try - catch


try {
    예외가 발생할 수 있는 코드
}
catch(예외타입 e) { // throw가 던진 예외를 받는다.
    예외가 발생했을 때 처리할 코드
}

try 블록 다음에는 하나 이상의 catch 블록이 올 수 있다.

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

예외 종류와 일치하는 catch 블록이 없을 경우 예외는 처리될 수 없다.


try - catch 블록 안에 여러 개의 try - catch 블록 포함될 수 있다.

이 때 예외의 참조변수 이름 (e)는 중복될 수 없다.


Exception 객체의 정보


Throwable 주요 메서드

public String getMessage()      // 발생된 예외에 대한 구체적인 메시지를 반환
public Trowable getCause()      // 예외의 원인이 되는 Trowable 객체 또는 null을 반환
public void printStackTrace()   // 예외가 방생된 메서드가 호출되기까지의 메서드 호출 스택을 출력
                                // 디버딩 수단으로 사용
                                // 사용시 외부에 프로그램 정보(메서드 호출 스택)가 노출 

try - catch 문에서의 흐름


try 블록에서 예외가 발생한 경우

  1. JVM이 해당 Exception 클래스의 개체 생성 후 던짐(throw)
    • throw new 예외EXception()
  2. 던져진 exception에 일치하는 catch 블록에서 받은 후 처리
    • catch 블록 내 문장 수행 후 try - catch 블록을 빠져나간다.
    • 일치하는 catch 블록이 없으면 예외는 처리되지 않는다.

try 블록에서 예외가 발생하지 않은 경우

  1. catch 블록을 거치지 않고 try - catch 블록을 빠져나간다.

다중 exception handling


catch 블록 괄호 () 내에는 처리하고자 하는 예외와 같은 타입의 참조변수 하나를 선언해야 한다.

catch 블록을 차례로 내려가며 괄호 () 내에 선언된 참조변수의 종류와 생성된 예외클래스의 인스턴스에 instanceof 연산자를 이용해 검사해 truecatch 블록을 만날 때까지 검사


JVM 이 던진 예외는 catch 문장을 찾을 때는 다형성이 적용됨

상위 타입의 예외가 먼저 선언되는 경우 뒤에 등장하는 catch 블록은 동작할 기회가 없다.

상속 관계가 없는 경우는 무관

상속 관계에서는 작은 범위(자식)에서 큰 범위(조상)순으로 정의


처리하지 않으면 컴파일 불가

예외 처리는 가능한 구체적으로 진행

가급적 예외 상황 별로 처리하는 것을 권장


심각하지 않은 예외를 굳이 세분화해서 처리하는 것은 낭비

| 이용해 하나의 catch 구문에서 상속관계가 없는 여러 exception 처리, 개수의 제한은 없다

'Java' 카테고리의 다른 글

컬렉션 프레임워크(Collection Framework)  (0) 2022.07.28
예외(Exception) 2  (0) 2022.07.28
제네릭(Generics)  (0) 2022.07.26
인터페이스(interface)  (0) 2022.07.25
추상 클래스(abstract class)  (0) 2022.07.25