☕Java: Exception (1) 예외 클래스, 예외처리

yoondgu·2022년 4월 18일
1

Java 

목록 보기
11/18
post-custom-banner

강의 수강 중 작성한 노트에서 내용을 발췌, 이응수 강사님 강의 의 노트와 이미지를 참조하고 있습니다.
스스로 이해를 위해 직접 쓴 문장들의 경우 정확성이 떨어질 수 있다는 점 참고 부탁드립니다.

예외 처리


프로그램 실행 시 발생할 수 있는 오류에 대비하는 것으로 프로그램의 비정상종료를 막고 실행 상태를 유지하는 것이다.

📌 오류의 종류

  • 에러 (Error)
    • 시스템, 운영체제, JVM의 잘못으로 발생되는 것
    • 개발자가 해결할 수 있는 문제가 아님
    • 예외처리의 대상이 아님
  • 예외 (Exception)
    • 예외는 개발자의 코딩실수나 사용자의 잘못된 프로그램 사용으로 발생하는 오류다.
    • 예외는 예외처리를 통해서 비정상적인 종류를 예방할 수 있다.
    • 예외는 UncheckedExceptionCheckedException으로 구분한다.

📌 예외 클래스 (UncheckedException / CheckedException)

Throwable, Exception 예외클래스

  • 자바 api의 각 패키지들 내에 일반적인 오류 상황에 따른 클래스들이 이미 만들어져 있다. (IOException, FileNotFoundException ...)
  • 프로젝트에 따라 그에 맞는 특별한 예외클래스를 직접 작성해야 할 때도 있다. (기존 예외클래스를 상속하여 작성)
  • 에러는 예외클래스의 대상이 아니다. 예외에 대한 작업은 Exception 클래스에서 이루어진다.

  • UncheckedException
    • RuntimeException 클래스와 그 하위 클래스들이다.
    • 주로 개발자의 코딩 실수로 발생되는 오류들이다.
    • 컴파일러가 예외처리 여부를 체크하지 않는다. 실행 시점에 확인된다.
      (구현 하지 않아도 컴파일 자체는 실행된다.)
  • CheckedException
    • Exception 클래스의 하위 클래스중에서
      RuntimeException 클래스의 하위 클래스가 아닌 예외클래스다.
    • 주로 사용자의 잘못된 사용으로 인해 발생되는 오류들이다.
    • 컴파일러가 예외처리 구현 여부를 반드시 체크한다.
      • 예외처리 관련 코드가 구현되어 있지 않으면 컴파일 오류가 발생한다.

💡 예외처리를 하지 않는다면
CheckedException은 컴파일러가 실행 전 구현 여부를 체크하고, 구현하지 않았을 시 실행 자체를 하지 않는다.
UncheckedException은 실행 전 구현 여부를 체크하지 않고, 강제되지는 않는다.
그러나 발생한 예외에 대하여 throws나 catch를 하지 못한 예외는 JVM에 전달되어 프로그램이 비정상적으로 종료된다.
따라서 필요에 따라 개발자가 적절한 예외처리를 해주는 것이 필요하다.
(Unchecked Exception에 대하여 자바 api의 메소드들이 throws로 예외처리를 호출 측에 위임하고 있는 경우도 있다.)

💡 - 최신의 라이브러리나 프레임워크에서는 CheckedException의 사용비중이 점점 줄어들고 있다. 대부분 UncheckedException으로 설계되고 있다. 그러한 이유는 예외 발생의 활용 예시를 보면 이해할 수 있다.



예외처리의 방법


📌 예외 파악하기

  1. 예외클래스명 확인 : 예외클래스명을 통해 예외 발생 원인 유추 가능
  2. 오류 원인을 나타내는 메세지 확인: 오류 원인 파악 가능
  3. printstack()으로 출력된 내용 중 내가 코딩한 클래스의 메소드 부분을 확인(위→아래 순으로)
  4. 개발자 실수로 인한 오류일 경우 확인 후 수정

📌 예외 처리하기

  • try ~ catch 구문으로 예외처리하기
    예외가 발생할 수 있는 수행문try블록 내에 작성하고, 예외 발생 시 실행될 수행문catch 블록 내에 작성한다.
    • 예외 발생시, 해당 예외를 지정된 변수명에 저장 후 catch블록에 정의된 수행문을 실행시킨다.
    • 예외 발생 시 실행될 수행문:
      • 발생한 예외정보를 로그파일에 기록
      • 사용자에게 경고창 표시 / 예외발생원인 안내
      • 개발자에게 오류 수정을 위한 디버깅메시지 출력
      • 발생한 예외를 다른 예외로 바꾸기 = 예외의 변환
    try {
        예외발생이 예상되는 수행문1;
    		// 예외가 발생하면 try블록의 나머지 블록은 실행하지 않고 즉시 catch 블록으로 넘어간다.
        수행문2;
        수행문3;
      } catch (발생이예상되는예외클래스명 변수명) {
        예외 발생시 실행될 수행문4;
        예외 발생시 실행될 수행문5;
      }
      수행문6;

💡 catch 블록에서 예외를 잡지않으면 프로그램이 비정상적으로 종료된다.
catch 블록 내 수행문이 따로 없어도, catch 블록을 작성한 것만으로도 예외 처리가 된다.
try 블록에서 여러 종류의 예외발생이 예상되는 수행문을 적었을 경우에는 그 예외의 종류만큼 catch 블록을 추가한다.

  • throws 키워드로 예외처리 위임하기 throws 키워드를 사용해서 예외처리를 위임할 수 있다. 메소드에서 발생하는 예외를 직접 처리하지 않고, 그 메소드를 호출하는 측에 예외처리를 위임하는 것이다.
    • 메소드가 위임한 예외처리는 호출하는 메소드에게 예외처리의 책임이 있다.
    • 메소드가 위임한 예외처리는 반드시 어느 한곳에서는 예외처리를 수행해야 한다. 렇지 않으면 JVM에게 예외가 전달되어 프로그램이 종료된다.
      • throws는 일괄처리를 위해 잠시 사용하는, 위임을 하는 키워드이다.
      • 예외처리가 강제되는 CheckedException에서 주로 사용한다.
    • 장점 및 활용
      • 해당 메소드(선언한 코드)에서 예외처리와 관련한 코드의 작성을 할 필요가 없다.
      • 여러 개의 예외처리를 각각의 메소드에서 직접 개별적으로 처리하지 않고, 한 군데에서 일괄처리할 수 있다.
        (예외의 변환과 throws 키워드의 활용)
      public void method() throws 예외클래스명, 예외클래스명, ... {
        예외발생이 예상되는 수행문;
        예외발생이 예상되는 수행문;
      }

💡 main메소드에서 throws로 예외를 던지면 이를 JVM이 잡아서 catch 처리를 해준다.

📌 예외 일괄처리

  • 예외처리는 업무로직을 수행하는 개별 메소드에서 하는 것보다는 한 곳에서 일괄처리하는 것이 더 좋다.
    • 코드의 중복을 제거할 수 있다.
    • 코드의 복잡도가 낮아진다.
    • 예외처리 정책이 변경되었을 때 코드 수정, 유지보수가 용이하다.
post-custom-banner

0개의 댓글