[JAVA 스터디] 9주차 : 예외처리

codename_hee·2021년 11월 12일
0

학습할 것

  • 자바에서 예외 처리 방법(try, catch, throw, throws, finally)
  • 자바가 제공하는 예외 계층 구조
  • Exception과 Error의 차이는?
  • RuntimeException과 RE가 아닌 것의 차이는?
  • 커스텀한 예외 만드는 방법

먼저 알고가기

자바의 에러

  • 컴파일 에러
    - 컴파일 과정에서 일어나는 에러
    • 자바 컴파일러가 문법 검사를 통해 오류를 잡아준다.
  • 런타임 에러
    - 실행 과정에서 일어나는 에러
    • 자바는 런타임 에러를 예외(Exception)과 에러(Error) 두 가지로 구분하여 대응하고 있다.

예외와 에러

  • 예외
    - 발생 시의 코드를 미리 정의함으로써 프로그래머가 이를 핸들링 할 수 있다.
  • 에러
    - 메모리 부족(OutOfMemoryError), 스택오버플로우(StackOverFlowError)처럼 JVM이나 하드웨어 등의 기반 시스템의 문제로 발생하는 것
    • 프로그래머가 이를 대비하여 핸들링 할 수 없기 때문에 애초에 발생하지 않도록 해야 한다.

예외 처리란?

  • 프로그램에서 예외가 발생했을 경우 프로그램의 갑작스러운 종료를 막고 정상 실행을 유지할 수 있도록 코드를 통해 처리하는 것

1. 자바의 예외 처리 방법, 기법(try, catch, throw, throws, finally)

1) try - catch

<try-catch>문의 기본 구조

try {
...
} catch (예외1) {
...
} catch (예외2) {
....
} finally {
	System.out.println("이건 반드시 실행되어야 합니다.");
}
  • try문 안의 수행할 문장들에서 예외가 발생하지 않을 경우 catch문 다음의 문장들은 수행되지 않는다.
  • try문 안의 문장들을 수행 중 해당 예외가 발생하면 예외에 해당되는 catch문이 수행된다.

2) finally

  • try - catch과 함께 쓰이고 어떤 예외가 발생되더라도 반드시 실행되어야 하는 부분이 있을 때 사용할 수 있는 블록
  • 예외 발생 여부와 상관없이 항상 실행할 내용이 있을 경우 사용한다.

3) throw

  • 프로그래머가 고의로 예외를 발생시키고자 할 때 사용할 수 있는 키워드
<throw 사용 예시>

if () {
	throw new IllegalArgumentException("부적절한 이름입니다.");
    // throw new IllegalArgumentException 구문을 풀어 쓴 경우
    // IllegalArgumentException e = new IllegalArgumentException("부적절한 이름입니다.");
    // throw e;
    }

4) throws

  • 메서드에 예외를 선언하고자 할 때 사용할 수 있는 키워드
  • 메서드의 선언부에 예외를 선언해둠으로써 메서드를 사용하는 사람이 해야하는 예외 처리가 어떤 것이 있는 지에 대해 정보를 제공하고 예외 처리를 '위쪽으로 미루어 처리'한다.
  • 해당 메서드를 사용할 경우 사용하는 쪽에서 반드시 throws 되어 있는 예외들을 처리해주어야 한다.
<throws 사용 예시>
// 메소드 호출
public static void main(String[] args) {
	SayHello sayHello = new SayHello();
    
    try {
    	sayHello.sayHello();
    } catch (Exception1 e) {
    	System.out.println("예외가 발생하였습니다");
    }
}

// 메소드 선언
public static void sayHello() throws Exception1, Exception2..ExceptionN {
//....
}

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

Throwable 클래스

  • 모든 예외와 에러 클래스들의 조상이 되는 클래스
  • 예외나 에러에 대한 정보를 확인할 수 있는 메소드를 가진다.
    - getMessage() : 해당 throwable 객체에 대한 자세한 내용을 반환
    - printStackTrace() : 예외나 에러가 발생 할 때까지의 이력을 출력
    - toString() : 해당 throwable 객체의 간단한 내용을 반환

3. Exception과 Error의 차이

Exception

  • 프로그램 실행중 발생한다.
  • 프로그래머가 예외를 처리하는 코드를 작성함으로써 방지가 가능하다.
  • 프로그램에서 복구할 수 있는 장애를 말한다.

Error

  • 실행 시 어떠한 원인에 의해 비정상적인 상황이 생겼거나 오작동, 종료되는 경우
  • 프로그램에서 복구할 수 없는 심각한 장애를 말한다.
  • 보통의 JVM이나 기타 하드웨어 등의 시스템 문제로 발생한다.
  • Error가 발생하면 프로그램이 비정상적으로 종료된다.
  • OutofMemory, StackOverFlow, ThreadDeath등이 있다.
  • 런타임 시 발생하며 예측이 불가능한 Unchecked Error에 속한다. 코드를 수정하지 않고서는 문제를 해결할 수 없다.

4. RuntimeException과 RE가 아닌 것의 차이

  • Java의 Exception 클래스는 RuntimeException과 이를 상속하는 클래스들은 Unchecked Exception으로, 그 외 Exception 클래스의 자식 클래스들은 Checked Exception으로 분류할 수 있다.
  • 둘의 차이는 아래 표의 내용과 같다.

Unchecked Exception

  • RuntimeException을 상속하는 예외들을 말한다.
  • 명시적으로 예외처리를 강제하지 않는다.
  • 프로그램에 오류가 있을 때 발생하도록 의도되었다.

Checked Exception

  • RuntimeException을 상속하지 않는 예외들을 말한다.
  • try - catch문을 사용하거나 throws로 예외를 자신을 호출한 클래스로 던지는 방법으로 반드시 예외를 처리해주어야 한다.
  • 그렇지 않으면 컴파일 시점에 에러가 발생한다.

5. 커스텀한 예외 만드는 방법

  • 최상위 클래스인 Exception을 상속받아(extends) Checked Exception을 구현한다.
  • RuntimeException을 상속받아 Unchecked Exception을 구현한다.

Checked Exception 예시

/*
* 이것은 커스텀 CheckedException 입니다.
* 자바의 기본 예외로 표현할 수 없는 예외를 제공하기 위해 만들어졌습니다. 
* */
public class CustomCheckedExceptionEx extends Exception {

    public CustomCheckedExceptionEx() {
    }

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

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

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

    public CustomCheckedExceptionEx(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}

class CustomCheckedExceptionTest {
    public static void main(String[] args) throws CustomCheckedExceptionEx {
        try {
            // doSomething
        } catch (Exception e) {
            throw new CustomCheckedExceptionEx("커스텀 체크드 예외 발생!!", e);
        }
    }
}

Unchecked Exception 예시

public class CustomUncheckedException extends RuntimeException {

    public CustomUncheckedException() {
    }

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

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

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

    public CustomUncheckedException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}

class CustomUncheckedExceptionTest {
    public static void main(String[] args) {
        try {
            // doSomething
        } catch (RuntimeException e) {
            throw new CustomUncheckedException("커스텀 언체크드 예외 발생!!", e);
        }
    }
}

[참고]
https://parkadd.tistory.com/69
https://zannew.tistory.com/23
https://velog.io/@zayson/%EB%B0%B1%EA%B8%B0%EC%84%A0%EB%8B%98%EA%B3%BC-%ED%95%A8%EA%BB%98%ED%95%98%EB%8A%94-Live-Study-9%EC%A3%BC%EC%B0%A8-%EC%98%88%EC%99%B8-%EC%B2%98%EB%A6%AC
https://youn12.tistory.com/32

profile
진정한 개발자로 가는 길

0개의 댓글