공부/Java

자바 예외 처리, Checked Exception와 Unchecked Exception

진호진호 2024. 2. 27. 21:26

자바에서는 오류를 Error와 Exception으로 나누고 클래스로 구현하여 처리하도록 하였다. Error 클래스는 외부적인 요인으로 발생하는 오류이기 때문에 개발자가 대처할 수 없다.

예외

프로그램의 정상적인 실행을 방해하는 사건

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

자바 오류 클래스 계층구조

 

예외 종류로 Checked Exception과 Unchecked Exception으로 나뉜다. 예외 처리 동작의 필수 지정 유무에 따라 나뉘기 때문이다.

 

유형   ex
Unchecked Exceoption Error 프로그램 외부에서 발생한 예외 H/W 또는 System 오동작
IOError 예외 자동 발생
Runtime-Exceoption program logic error
부적절한 API 사용
fileName이 null인 경우
NullPointerException 자동 발생
Checked Exception 표준 검사 예외 예외 처리 필수
컴파일러가 예외 처리 여부를 검사
파일이 존재하지 않는 경우
FileNotFoundException 자동 발생
사용자 정의 예외 예외(객체)를 명시적으로 발생시켜야 함:
if(조건) new 예외타입();

 

예외 처리 방법

1. 예외가 발생한 메소드에서 직접 처리 try-catch

int a = 5
int b = 0
try{
	System.out.println(a/b);
}catch (ArithmeticException e){
	System.out.println("0으로 나눌 수 없습니다.");
}finally {
	//...
}

try 블록 실행 도중 예외 발생?

NO > (try block 정상 종료 후) finally 블록 실행

YES > try 블록 즉시 종료 > catch 블록 실행 > finally 블록 실


2. 자신을 호출한 메소드에게 예외를 넘긴다(예외 전파)throws

	public static int aMethod(int a, int b) throws ArithmeticException{
        return a/b;
    }
    public static void main(String[] args) {
        int a = 5;
        int b = 0;
        try{
            aMethod(a,b);
        }catch (ArithmeticException e){
            System.out.println("0으로 나눌 수 없습니다.");
        }finally {
            //...
        }
    }

발생한 예외를 처리할 catch 블록을 만날 때까지 전파함.

outer blocks > callers > JVM

 

*try with resource

 

명시적 예외 발생 throw

명시적으로 예외를 발생시킨다.

        int a = 5;
        int b = 0;
        try{
            if(b==9) throw new ArithmeticException("zero");
            else if(b<0) throw new ArithmeticException("negative");
            else
                a = a/b;
        }catch (ArithmeticException e){
            System.out.println(e.getMessage());
        }finally {
            //...
        }