3. JAVA - 예외 처리

hsso_o·2024년 7월 12일
0

스터디

목록 보기
18/44

예외 처리

  • 오류(Error) : 시스템 상에서 프로그램에 심각한 문제가 발생해 실행 중인 프로그램이 종료되는 것
    • 개발자가 미리 예측하거나 코드로 처리하는 것이 불가능 한 경우
  • 예외(Exception) : 발생할 수 있는 상황을 미리 예측하고 처리할 수 있는 미약한 오류
    • 예외 상황의 경우는 개발자가 처리하여 코드의 흐름을 컨트롤할 수 있음
  • 사용 이유
    • 미리 예측하고 컨트롤 할 수 있는 예외를 처리함으로써 프로그램이 예상치 못한 상황에 봉착하지 않도록 코드의 안정성과 신뢰성을 높여 이를 미연에 방지하거나 의도한 방향으로 컨트롤 가능
    • 디버깅 용이하게 하여 예외 원인과 위치 파악을 쉽게 할 수 있음
  • 오버라이딩 시 예외 발생 가능 범위
    • 상속 시 오버라이딩하는 메소드는 부모 클래스의 원본 메소드보다 더 상위 타입의 예외를 발생 시키면 안됨

예외 클래스

  • 오류와 예외는 모두 Throwable을 상속
  • 예외의 최상위 클래스는 Exception 클래스
  • Unchecked Exception 계열은 기본적으로 이미 처리되어 있고 실행 중인 프로그램이 종료되게 작성되어 있다.
  • Checked Exception 계열은 반드시 예외 처리를 해야 하고 하지 않으면 컴파일 에러가 발생한다.
  • RuntimeException타입의 예외들은 런타임 시점에 해당 예외 클래스 타입의 Exception이 발생한다.

예외 처리 방법

  1. throws로 위임

    • Exception이 발생하는 메소드(또는 생성자)를 호출한 상위 메소드에게 처리를 위임하는 방식
  2. try-catch(- finally)로 처리

    • 발생한 Exception을 직접 처리하는 방식
  • try 블럭
    예외(Exception)가 발생할 가능성이 있는 코드를 포함하여 작성하는 블럭
    catch블럭
    try 블럭에서 예외 발생 시 해당 예외 타입(Exception 클래스 타입)에 대한 처리를 기술하는 블럭이다.
    여러 개의 catch블럭을 이어서 사용할 수 있으며 상위 타입의 예외를 처리하는 catch 블럭이 아래 쪽에 위치해야 한다.
    finally 블럭
    예외 발생 여부와 상관 없이 꼭 실행되어 처리해야 할 코드가 있으면 작성하는 블럭이다. 주로 java.io나 java.sql 패키지의 메소드 처리 시 자원 반납을 위해 사용한다.
  • try-with-resource
    • 입출력에서 사용되는 스트림의 자원 반납(close())을 finally 블럭을 사용하지 않고 용이하게 처리하기 위해 도입된 문법
    • try-with-resources 문은 AutoCloseable 인터페이스를 구현한 자원만 사용 가능
    • 사용 이유
      • 자원 누수 방지 : 자원을 자동으로 닫아주므로 따로 close() 해줄 필요X
      • 코드 간결성 : finally 블록에서 따로 코드를 작성할 필요 없음
      • 안정성 : 예외가 발생해도 자원이 제대로 닫히는 것 보장 가능
      // try 블록이 종료되면 자원은 자동으로 닫힘
      try (BufferedReader br = new BufferedReader(new FileReader("example.txt"))) {
              String line;
              while ((line = br.readLine()) != null) {
                  System.out.println(line);
              }
          } catch (IOException e) {
              e.printStackTrace();
          }

커스텀 예외

  • 필요에 따라 사용자 정의 예외를 만들 수 있음
class MyCustomException extends Exception {
    public MyCustomException(String message) {
        super(message);
    }
}

public class CustomExceptionExample {
    public static void main(String[] args) {
        try {
            throw new MyCustomException("This is a custom exception");
        } catch (MyCustomException e) {
            e.printStackTrace();
        }
    }
}
profile
아뇨 소혠데요-

0개의 댓글