[JAVA] 4주차 : 예외처리

INHEES·2023년 8월 15일

Java

목록 보기
7/13

JAVA 4주차 문법 : 예외처리

오류, 예외

오류(Error)

  • 시스템 레벨에서, 또는 환경적인 이유로 발생한다.
  • 문제가 발생하면 일반적으로 회복이 불가능하다.

예외(Exception)

  • 일반적으로 회복이 가능한 문제이다.
  • 현실적으로 코드레벨에서 할 수 있는 문제상황에 대한 대응은 예외처리에 속한다.
  • 예외가 발생할 수 있다는 것을 미리 인지하고, 대응하는 것이다.

Complie error

  • java 파일을 class 파일로 컴파일할 때 발상하는 에러
  • 일반적으로 언어의 규칙을 지키지 않았기에 발생

runtime error

  • 문법적인 오류는 아니며 컴파일은 잘 되었지만 프로그램 이 실행 도중 맞닥뜨리는 예외

예외의 종류

Checked Exception

  • 컴파일 시점에 확인하는 예외
  • 반드시 예외 처리를 해줘야 하는 예외

    Complie Error 와는 다른 단어이다.
    Checked Exception 는 문제를 인지하고, 해당 예외를 정의해 두었기에 컴파일동안 예외에 대한 예외처리가 되었는지 체크하는 예외이다.

Unchecked Exception

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

예외처리의 흐름

step

1. 우리가 예외를 어떻게 정의하고,

  class OurBadException extends Exception {
      public OurBadException() {
          super("위험한 행동을 하면 예외처리를 꼭 해야합니다!");
      }
  }

2. 예외가 발생 할 수 있음을 알리고,(throw, throws)

  class OurClass {
      private final Boolean just = true;
      public void thisMethodIsDangerous() throws OurException {
          if (just) {
              throw new OurException();
          }
      }
  }

throws : 메서드 뒤에 붙어 어떤 예외사항을 던질 수 있는지 알려주는 예약어
throw : 메서드 안에서, 실제로 예외 객체를 던질 때 사용하는 예약어

3. 사용자는 예외가 발생 할 수 있음을 알고 예외를 핸들링하는지

  public class StudyException {
      public static void main(String[] args) {
          OurClass ourClass = new OurClass();

          try {
              ourClass.thisMethodIsDangerous();
          } catch (OurException e) {
              System.out.println(e.getMessage());
          } finally {
              System.out.println("예외 handling");
          }

      }
  }

즉 위의 예제에서 checked exception을 정의하였으니 메서드에 예외처리를 하지않으면 컴파일 에러 가 발생하는 것이다.

예외 클래스 구조

JAVA Throwable Class

  • 모든 객체의 원형은 Object 클래스에서 시작한다.
  • Throwable 클래스는 Object 클래스를 상속한다.
  • 밑으로 ErrorException 클래스가 있다.

Exception 클래스 구조

위의 그림의 RuntimeException을 상속한 예외들은 UncheckedException, 반대로 상속하지 않은 예외들은 CheckedException으로 구현되어 있다.

CheckedException에 속하는 에러 구현체들은 핸들링 하지 않으면 컴파일 에러가 발생한다는 것도 알아야 한다.

결국에는 수많은 에러 구현체들이 이미 구현되어있다.
즉 명시적으로 어떠한 에러르 내보낼지는 찾아보고 자신이 결정하면 된다.

Chained Exception

  • 예외 A가 예외 B를 발생시켰다면, 예외 A는 B의 원인 예외이다.
  • 원인 예외를 새로운 예외에 등록한 후 다시 새로운 예외를 발생시키는데, 이는 예외 연결이다.
  • Checked Exception 을 Unchecked Exceptiond 으로 Wrapping 하는데 유용하다.
// 연결된 예외 
public class main {
	//방법 1
    public static void main(String[] args) {
        try {
            // 예외 생성
            NumberFormatException ex = new NumberFormatException("가짜 예외이유");

            // 원인 예외 설정(지정한 예외를 원인 예외로 등록)
            ex.initCause(new NullPointerException("진짜 예외이유"));
            throw ex;
        } catch (NumberFormatException ex) {
            // 예외 로그 출력
            ex.printStackTrace();
            // 예외 원인 조회 후 출력
            ex.getCause().printStackTrace();
        }
//////////////////////////////////////////////////////////////        
        //방법 2
        // checked exception 을 감싸서 unchecked exception 안에 넣습니다.
        throw new RuntimeException(new Exception("이것이 진짜 예외 이유 입니다."));
    }
}
// 출력
Caused by: java.lang.NullPointerException: 진짜 예외이유

실무에서의 다양한 예외 처리

예외 복구하기

  • try-catch 로 예외를 처리, 자주 사용되지는 않는다.
  public String getDataFromAnotherServer(String dataPath) {
          try {
                  return anotherServerClient.getData(dataPath).toString();
          } catch (GetDataException e) {
                  return defaultData;
          }
  }

예외 처리 회피하기

  • someMethod()에서 발생한 에러가 someIrresponsibleMethod()의 throws를 통해서 그대로 다시 흘흘러 나간다.
  public void someMethod() throws Exception { ... }

  public void someIrresponsibleMethod() throws Exception {
          this.someMethod();
  }

예외 전환하기

  • 적절한 예외를 던져주는 경우이다.
  • RuntimeException 처럼 일괄적으로 처리하기 편한 예외로 바꿔서 던지고 싶은 경우 사용한다.
  public void someMethod() throws IOException { ... }

  public void someResponsibleMethod() throws MoreSpecificException {
          try {
              this.someMethod();
          } catch (IOException e) {
              throw new MoreSpecificException(e.getMessage());
          }
  }

정리

기본적인 예외처리 순서의 설명을 생략하고 예외 처리의 종류와 예외가 처리되는 로직의 순서들을 알아갈 수 있었다. 다음시간에는 제네릭 문법에 대해 알아본다.

profile
이유를 찾아보자

0개의 댓글