본문 바로가기
Back-End/Java

예외 처리(exception handling)

by 달의 조각 2021. 12. 26.
Exception클래스: 최고 조상
Exception클래스들: 사용자의 실수와 같은 외적인 요인에 의해 발생 - 컴파일러가 예외 처리 확인 'checked예외'
RuntimeException클래스들: 프로그래머의 실수 - 컴파일러가 예외 처리 확인하지 않는 'unchecked예외'

 

1. 예외 처리하기 - try-catch문

try {
	// 예외 발생 가능성 있는 문장
	// 예외 발생 위치 이후에 있는 try블럭의 문장은 수행되지 않는다
} catch (Exception e) {
	// Exception 발생할 경우, 이를 처리하기 위한 문장
}

ArithmeticException: 산술연산과정에서 오류가 있을 경우 발생 - 정수는 0으로 나누는 것 금지, 실수는 허용

 

1.1 발생 원인 찾기

printStackTrace() 예외 발생 당시 호출 스택에 있었던 메서드의 정보와 예외 메시지 화면에 출력
getMessage() 발생한 예외 클래스의 인스턴스에 저장된 메시지 얻기

 

2. 예외 발생시키기

Exception e = new Exception("고의로 발생시켰음"); // 메시지는 getMessage()를 이용하여 얻을 수 있다
throw e;

 

3. 메서드에 예외 선언하기

void method() throws Exception1, Exception2, . . . ExceptionN {
	// 메서드 내용
}
  • 예외 발생은 throw, 예외 선언은 throws
  • 일반적으로 RuntimeException클래스들은 적지 않는다.
  • 예외를 처리하는 것이 아니며, 자신을 호출한 메서드에 예외를 전달하여 예외 처리를 떠맡긴다.(main메서드까지)
  • 어느 한 곳에서는 반드시 try-catch문으로 예외 처리

 

4. finally블럭

try {
	// 예외 발생 가능성 있는 문장
	// 예외 발생 위치 이후에 있는 try블럭의 문장은 수행되지 않는다
} catch (Exception e) {
	// Exception 발생할 경우, 이를 처리하기 위한 문장
} finally {
	// 예외 발생 여부와 관계 없이 항상 수행되어야 하는 문장
}

try블럭, catch블럭에서 모두 사용되어 중복되는 문장을 finally블럭에 넣기

 

5. 자동 자원 반환 - try-with-resources문

입출력 클래스 중에서는 사용한 후 닫아 줘야 사용했던 자원이 반환되는 것이 존재하는데, finally에 close()를 넣었을 때 여기서 에러가 발생할 수 있다. 그렇다고 해서 finally에 try-catch문을 넣으면 문장이 복잡해지고 try블럭의 예외가 무시될 수 있다.

→ try-with-resources문의 괄호 안에 객체 생성 문장을 넣으면 이 객체는 따로 close()를 호출하지 않아도 try블럭을 벗어나는 순간 자동으로 close()를 호출한다. - 클래스가 AutoCloseable 인터페이스를 구현한 것이어야만 한다.

public interface AutoCloseable {
	void close() throws Exception;
}

 

6. 사용자정의 예외 만들기

class MyException extends Exception {
	private final int ERR_CODE; // 생성자를 통해 초기화
    
	MyException(String msg, int errCode) { // 문자열을 매개변수로 받는 생성자(메시지)
    	super(msg); // 조상인 Exception클래스의 생성자 호출
        ERR_CODE = errCode;
    }
    
    MyException(String msg) {
    	this(msg, 100);
    }
    
    public int getErrCode() {
    	return ERR_CODE;
    }
}

 

7. 예외 되던지기(exception re-throwing)

  • 예외를 처리한 후에 인위적으로 다시 발생시키는 방법
  • 단 하나의 예외에 대해서도 예외가 발생한 메서드와 호출한 메서드, 양쪽에서 처리 가능하게 된다.

 

8. 연결된 예외(chained exception)

한 예외가 다른 예외를 발생

Throwable initCause(Throwable cause) // 지정한 예외를 원인 예외로 등록
Throwable getCause() // 원인 예외를 반환

RuntimeException(Throwable cause) // 원인 예외를 등록하는 생성자
  1. 여러가지 예외를 하나의 큰 분류의 예외로 묶어서 다루기 위해서 이용
  2. checked예외를 unchecked예외로 바꿀 수 있도록 하기 위해서 이용

 

 

 

출처: 남궁성, 『자바의 정석』, 도우출판, 2016

'Back-End > Java' 카테고리의 다른 글

지네릭스, 열거형, 애너테이션  (0) 2022.02.21
컬렉션 프레임웍  (0) 2021.12.30
객체지향 프로그래밍 Ⅱ  (0) 2021.12.16
객체지향 프로그래밍 Ⅰ  (0) 2021.12.02
배열(array)  (0) 2021.11.25

댓글