Everyday Dev System

4주차 공부 - 예외처리 본문

내배캠 초기 학습/Java 문법 종합반

4주차 공부 - 예외처리

chaeyoung- 2023. 5. 24. 18:31

1. 오류와 에러

오류는 시스템 레벨에서, 또는 환경적인 이유로 발생. 회복 불가

예외는 일반적으로 회복(handle)이 가능

 

컴파일 에러

- .java 파일을 .class 파일로 컴파일할 때 발생하는 에러

- 자바 프로그래밍 언어의 규칙을 지키지 않았기 때문에 발생

런타임 에러

- 주로 다루게 될 예외

- 컴파일은 잘 되었지만, 프로그램이 실행 도중에 맞닥뜨리게 되는 예외

 

 

2. << 예외 처리 관점에서 예외의 종류 >>

Unchecked Exception

런타임 시점에 확인되는 예외, 에외 처리가 반드시 필요하지 않은 예외이다.

 

Checked Exception

컴파일 에러와 상이함. 

우리가 이미 특정한 문제를 인지하고 잇어서 예외를 정의해두었고, 정의해두었기 때문에 컴파일 하는 동안

이 예외에 대한 예외처리를 했는지 확인 가능한 예외.

''즉 Checked Exception에 대한 예외처리를 하지 않으면 컴파일 에러 발생"

컴파일 시점에 개발자가 예외 처리를 해놔서 예외 사항으로 분류 되어 있어야 하는 것을 뜻함.

-> 이것이 바로 확인된 예외이다

public class OurBadException extends Exception{

    public OurBadException() {
        super("위험한 행동을 하면 예외처리를 해야함");
    }
}
public class OurClass {
    private final boolean just = true;

    // throws : 던지다! (=예외를 던지다 / 발생시키다)
    public void  thisMethodIsDangerous() throws OurBadException{
        if(just) {
            throw new OurBadException();
        }
    }
}

예외 클래스를 만들어서 예외를 정의!

public void  thisMethodIsDangerous() throws OurBadException{ } -> flag를 달아준 것.

public void  thisMethodIsDangerous() throws OurBadException{

throws - 메서드 이름 뒤에 붙어 이 메서드가 어떠한 예외사항을 던질 수 있는지 알려주는 예약어

               여러 종류의 예외사항을 적을 수 있습니다.

throw new OurBadException();

throw - 메서드 안에서, 실제로 예외 객체를 던질 때 사용하는 예약어

              실제로 던지는 예외 객체 하나와 같이 써야 함.

              일반 메서드의 reutn 키워드처럼 throw 아래의 구문들은 실행되지 않고, throw문과 함께 메서드 종료됨.

 

 

3. 예외 처리 실습

1. 예외가 발생하는 상황을 인지, 어떠한 에러인지 정의

2. 우리는 메서드를 선언할 때 에외가 발생하는 위험한 메서드라는 것을 알림 (throws / throw)

3. 우리가 checked exception을 정의하고, 알렸으니 이 메서드를 사용 할 때 예외처리를 하지 않으면 컴파일 에러 발생

public class StudyException {

    public static void main(String[] args) {
        OurClass ourclass = new OurClass();
        ourclass.thisMethodIsDangerous();
    }
}

flag를 달아놓은 thisMethodIsDangerous()를 쓰면 빨간밑줄이 자동으로 뜸.

이때 예외처리 로직을 통해 감싸줘야 함. try catch finally

        public static void main(String[] args) {
            // try ~ catch ~ finally 구문 사용
            OurClass ourclass = new OurClass();
            try {
                // 일단 실행
                ourclass.thisMethodIsDangerous();
            } catch (OurBadException e) {
                System.out.println(e.getMessage());
            } finally {
                // 무조건 거침
                System.out.println("무조건 거쳐요");
            }
        }

Result : 

위험한 행동을 하면 예외처리를 해야함
무조건 거쳐요

 

 

4. << 예외 처리 순서 >>

1. 맞닥뜨린 문제를 회복 가능 여부에 따라 Error / Exception으로 나눔.

2. 예외와 에러를 컴파일 / 런타임과 같은 여러가지 기준에 따라 구체적으로 "정의"함.

"문제" 상황을 추상화, 일반화, 구체화해서 정의

가장 추상적인 "문제"

조금 더 구체적인 "오류" , "예외"

더 구체적인 "Checked Exception" / "Unchecked Exception"

우리가 해야할 것은 실제로 어떠한 에러가 어떻게 구현되어 있는지 공부,

더 정확하게 에러 상황을 대응할 지식을 얻고, 객체지향 프로그래밍에서 추상화를 잘한 좋은 예시를 공부

 

5. Throwable Class

- Object 클래스를 상속함.

- 자식클래스로 Error , Exception 클래스가 있음.

- Errorr 클래스에는 IOError 클래스, Exception 클래스에는 IOException,RuntimeException 클래스 등이 있음.

** RuntimeException 은 Unchecked Exception를 구현한다.

    IOException은 Checked Exception을 구현한다.

 

 

 

6. Chained Exception, 실제 예외 처리하는 방법

ㄴㅇ

예외는 다른 예외를 유발할 수 있다.

원인 예외를 새로운 예외에 등록한 후 다시 새로운 예외를 발생시키는데, 이를 예외 연결이라고 한다.

원인 예외를 다루기 위한 메소드

  • initCause()
    • 지정한 예외를 원인 예외로 등록하는 메소드
  • getCause()
    • 원인 예외를 반환하는 메소드

checked exception을 unchecked exception으로 포장하는데 유용하게 사용

(checked exception은 try catch문을 써야 하기 때문에 코드가 길어지기 때문에 코드를 줄이기 위해 포장하는 것임)

아래 코드 예시 참조

    throw new RuntimeException(new Exception("이것이 진짜 예외 이유입니다."));

initCause()로 원인예외를 설정해준 예외는 getCause()로 잡을 수 있음.

 

 

<< 실제로 예외 처리하기 >>

예외 복구

예외 처리 회피

예외 전환