[Java] 예외처리

정석·2023년 12월 17일

Java

목록 보기
10/39
post-thumbnail

예외처리 ▶︎ 예기치 못한 오류를 처리하기 위한 방법

예외 설명에 앞서 자바의 예외 클래스 상속 관계에 대해 그림으로 알아본다.

아래 이미지를 보면 위로 올라 갈수록 부모 클래스이고 아래의 예외들을 상속하고 있다는 의미이다.

이미지 속 예시로 ArithmeticException 예외와 IOException의 차이는 부모 클래스에 RuntimeException 의 유무로 구분할 수 있으며 다음과 같이 두가지로 나뉜다.

실행 예외

  • RuntimeException 가 부모로 존재하면 unchecked 예외라 불린다.
    쉽게 말해 "체크하지 않아도 된다." -> "예외처리 굳이 안해도 된다." 라는 의미이다.

일반 예외

  • 반대로 RuntimeException 가 부모로 존재하지 않으면 checked 예외라 한다.
    "체크해야 된다." -> "예외처리 무조건 해야 된다." 라는 의미이다.
  • 따라서 일반 예외의 경우 무조건 try-catch 와 같이 처리를 시켜줘야 한다.

그렇다면 이렇게 예외를 나눈 이유는 무엇일까?

사용자가 API 사용 방법을 어겨서 발생하는 문제이거나 예외 상황이 이미 발생한 시점에서, 프로그램을 종료하는 것이 덜 위험할 때 unchecked 를 사용하는 것이다.

API 쪽에서 예외를 던졌을 때 API 사용자가 예외 상황을 복구 할 수 있다면 (예를 들어 파일 선택 오류, 입력 값 오류 ..) 사용자에게 문제를 해결할 기회를 주는 checked 예외를 사용하는 것이며 이를 위해 예외처리를 강조하는 것이다.


대표적 예외 처리 방식

1. try - catch - finally

public class CheckedException {

	public static void main(String[] args) {
    	FileWriter f = null;
        
        try {
        	f = new FileWriter("data.txt");
            f.write("Hello");
        } catch (IOException e) {
        	e.printStackTrace();
        } finally {
        	if (f != null) {
            	try {
                	f.close();
                } catch (IOException e) {
                	e.printStrackTrace();
                }
            }
        }
    }
}

첫 번째 try-catch 구문으로 파일 IO 오류를 캐치하는 구문을 만들고 모든 과정의 마지막에 수행 될 finally 구문을 만든다. 이 구문을 통해 파일을 닫아준다. 하지만 close 함수도 예외처리가 필수로 사용되어야 하기에 try-catch 구문을 추가하였다.

2. try - with - resources

public class TryWithResource {
    public static void main(String[] args) {
        try(FileWriter f = new FileWriter("data.txt")){ // 이 부분
            f.write("Hello");
        } catch(IOException e){
            System.out.println("오류");
        }
    }
}

주로 파일 관련 IO 에서 close 할 때 사용된다. close 하는 부분을 try 구문에 작성하면 된다.

0개의 댓글