Language/Java

Exception Handling in Java

Kim Jinung 2023. 5. 17. 12:57

Hierarchy of Java Exception classes

Overview

https://www.javatpoint.com/exception-handling-in-java

Throwable 클래스가 모든 예외 클래스의 루트 클래스다. Throwable 클래스 하위에는 두 개의 클래스가 존재한다. 

 

  • Exception
  • Error

Types of Java Exceptions

https://www.javatpoint.com/exception-handling-in-java

1) Checked Exception

컴파일 타임에 체크되는 에러다. Error와 Runtime exception을 제외하면 모두 여기에 해당한다. IOException, SQLException, ClassNotFoundException등이 체크 예외에 해당한다. 현재 메서드에서 예외를 처리하지 못하면 반드시 예외를 발생시켜서 던져주어야 한다.

2) Unchecked Exception

Runtime exception을 상속하는 예외다. NullPointException, ArrayIndexOutOfBound 예외 등이 여기에 해당한다. 런타임 예외라고 부르는 게 이해하기에는 더 와닿는다. 컴파일 타임에 잡을 수 없는 예외다. 예외가 발생했을 때 이를 던지지 않을 수도 있다. (최근 대부분 자바 프레임워크들은 런타임 예외를 선택하고, 예외 발생 시 유저가 자유롭게 핸들링 하게 하는 추세인 것 같다.)

3) Error

돌이킬 수 없는 예외다. OutOfMemory, VirtualMachineError등이 여기에 해당한다.

Use case

  • try, catch, finally 키워드를 이용해서 예외를 다룰 수 있다.
  • throw 키워드를 이용해서 예외를 생성 및 밖으로 던질 수 있다.
  • 언체크 예외(런타임 예외)는 처리하지 않고 넘어갈 수도 있다.
  • 체크 예외는 반드시 처리해주어야 한다.

Java Exception Propagation

자바의 예외 전파는 콜스택의 최상단부터 시작해서 탑다운으로 내려간다. 만약 실행 중인 현재 메서드에서 예외를 잡지 않으면 해당 메서드를 실행 한 이전 메서드가 예외를 받는다. 이런 흐름으로 계속 반환해서 콜스택 끝까지 내려간다.

메서드 m에서 예외를 던지면 메서드 n이 받는다. 메서드 n이 처리하지 않으면 다시 p가 받는다. p가 처리하지 않으면 최종적으로 콜스택 최하단에 위치한 main 메서드에서 예외를 받게 된다.

 

이때 체크 에러라면 마지막 main까지 가면서 반드시 처리 해주어야 하지만, 런타임 예외는 처리하지 않고 넘어갈 수도 있다.

Throws vs Throw

  • Throw 키워드는 메서드 혹은 코드 블록 내에서 예외를 직접 발생시킬 때 사용한다. 예외 처리를 메서드가 직접 담당한다.
  • Throws 키워드는 메서드를 사용 시 내부에서 예외를 발생시킬 수 있음을 시그니처로 명시한다. 예외 처리를 사용자에게 맡긴다.
public class TestThrows {
	
    public static int divideNum(int m, int n) throws ArithmeticException {
    	int div = m / n;
        return div;
    }
    
    public static void main(String[] args) {
    	
        TesThrows obj = new TestThrows(); 
        
        try {
        	obj.divideNum(1, 0);
        } catch(ArithmeticException e) {
        	System.out.println("Occur exception");
        }
    }
}

Throws와 Throw 키워드가 언뜻 보면 대척점에 있는 것 같은데 용도 자체가 다르다. throws 키워드는 메서드 사용 시 이러한 예외가 발생 할 수 있으니까 사용하는 측에서 잡으라고 알려주는 목적이고, throw는 메서드 내에서 예외를 직접 발생 시키기 위해 사용한다.

 

위 코드를 리팩터링 한다면 divideNum 메서드 내에서 n의 값을 확인해서 1보다 작다면 IllegalArgumentException을 던지게 할 것이다.


Reference

https://www.javatpoint.com/exception-handling-in-java

 

Exception Handling in Java | Java Exceptions - javatpoint

Exception Handling in Java or Java Exceptions with checked, unchecked and errors with example and usage of try, catch, throw, throws and finally keywords.

www.javatpoint.com