본문 바로가기
JAVA

예외처리

by e-pd 2021. 1. 10.

https://github.com/whiteship/live-study/issues/9

 


자바에서 예외 처리 방법 (try, catch, throw, throws, finally)

try-catch-finally 

try {
	// 예외가 발생할 수 있는 코드
} catch (예외클래스1 변수명) {
	// 예가 발생했을 때 해당 예외를 처리할 수 있는 코드
} catch (예외클래스2 변수명) {
	// 예가 발생했을 때 해당 예외를 처리할 수 있는 코드
} finally {
	// 예외 발생 여부 상관 없이 항상 실행되는 코드
}

 

catch

catch는 하나 이상 있을 수 있음

 

 

finally

생략가능

 

 

Throws

 

메서드 throws 예외 클래스 이름
   public static void main(String[] args) throws IOException {
        byte[] receive = new byte[64];
        Read(receive);
    }

    private static void Read(byte[] buffer) throws IOException {
        System.in.read(buffer);
    }
  • 반드시 시그니쳐 옆에 추가해야함
  • checked 예외를 던지는 메서드
  • 다른 메서드에서 발생한 checked 예외를 처리하지 않는 메서드
  • 추가 안하면 컴파일 오류

 

예외 처리시 주의 사항

부모 예외 클래스가 자식보다 먼저 나오면 안된다.

try {

} catch (Exception e) {

} catch (ArithmeticException e) {
	// 자식 예외 클래스가 실행되지 못한다
} 

 

printStackTrace() 

현재 발생한 예외의 호출 스택을 보여줌

 

 

 

예외 발생시 진행 순서

1. try 블록 실행이 중단

2. catch 블록 중에 예외를 처리할 수 있는지 찾음

3. 예외를 처리할 수 있는 catch 블록이 없으면 finally 블록을 실행 후, 한 단계 높은 try 블록으로 전달

4. 예외를 처리할 수 있는 catch 블록이 있으면 catch 안의 코드 실행 fianlly 블록 실행

 

 

 

RuntimeException의 생성자

 public RuntimeException() {
        super();
    }

    public RuntimeException(String message) {
        super(message);
    }

    public RuntimeException(String message, Throwable cause) {
        super(message, cause);
    }

    public RuntimeException(Throwable cause) {
        super(cause);
    }

    protected RuntimeException(String message, Throwable cause,
                               boolean enableSuppression,
                               boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
 }

자식 클래스 생성자에서 반드시 super() 호출해야함

호출을 안하면 message, cause가 저장되지 않음

 

 

 

try-with-resource

try (InputStream is = new FileInputStream(file)) { 
     // 필요한 코드 실행
} catch (Exception e) {
    //예외 발생 시, 예외에 대한 처리
}

java 1.7 에서 도입

try에 자원 객체를 전달하고, try 코드 블록이 끝나면 자동으로 자원 종료

 

 


자바가 제공하는 예외 계층 구조

 

 

 

Checked Exception

  • 컴파일러가 예외 처리를 하는지 확인(Check) 해줌
  • 어느 메서드가 어떤 예외를 던지는지 명확히 알 수 있음
  • 예외가 발생하는 코드에서 catch 블록에서 예외를 처리, catch 처리를 안하면 시그니처 옆에 표기

ex) IOException, SQLException

 

 

 

UnChecked Exception

  • RuntimeException을 상속
  • 컴파일러가 따로 검사를 안해줘서 unchecked 예외

Exception 클래스를 상속하면 checked exception

RuntimeException을 상속하면 unchecked exception

 

 


Exception과 Error의 차이는?

Exception

프로그램이 핸들링 할 수 있음

 

Error

시스템에 비정상적인 상황. 시스템 레벨의 심각한 오류. 개발자가 핸들링이 불가능하다.

 


RuntimeException과 RE가 아닌 것의 차이는?

RuntimeException은 CheckedException과 UncheckedException을 구분하는 기준.

Exception 자식 클래스 중 RuntimeException을 제외한 클래스는 CheckedException이다.

 


커스텀한 예외 만드는 방법

Exception을 상속 받아 예외를 만들거나, RuntimeException을 상속받아 실행 예외를 만들 수 있다.

 

public class CustomException extends RuntimeException{

    public CustomException() {
        super();
    }

    public CustomException(String message) {
        super(message);
    }

    public CustomException(String message, Throwable cause) {
        super(message, cause);
    }

    public CustomException(Throwable cause) {
        super(cause);
    }

    protected CustomException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}

 

'JAVA' 카테고리의 다른 글

enum  (0) 2021.01.25
멀티쓰레드 프로그래밍  (0) 2021.01.16
인터페이스  (0) 2021.01.03
패키지  (0) 2020.12.28
상속  (0) 2020.12.21