KYBee 2022. 8. 14. 20:15

에러와 예외

에러와 예외

어떤 원인에 의해 오동작 하거나 비정상적으로 종료되는 경우

  • 심각도에 따라 분류
    • Error
      • 메모리 부족, stack overflow와 같이 일단 발생하면 복구할 수 없는 상황 : 종료를 해야만 한다.
      • 프로그램의 비정상적 종료를 막을 수 없고 → 디버깅 필요
    • Exception
      • 읽으려는 파일이 없거나, 네트워크 연결이 안되는 등, 비교적 가벼운 상태가 약한 것들
      • 프로그램 코드에 의해 수습될 수 있다.
  • Exception Handling
    • 이러한 Exception을 처리해서 프로그램의 비정상 종료를 막는다.
    • 예외 감지 코드, 예외 발생 시 동작할 코드 필요

 

Exception

  • Checked Exception
    • 예외에 대한 처리가 없으면 컴파일 자체가 안됨
    • 반드시 throws로 위임 혹은 try catch로 처리 필요
  • Unchecked Exception
    • 예외에 대한 대처 코드가 없어도 일단 컴파일은 진행 됨
    • throws 하지 않아도 전달되지만 결국 try catch로 처리 필요

Try - Catch 로 처리함

int[] intArr = {10};

try {
    System.out.println(intArr[2]);
catch (ArrayIndexOutOfBoundsException e) {
    System.out.println("에러 핸들링");
    e.printStackTrace();
}

예외 발생 시

  • JVM이 해당 익셉션 클래스를 생성하여 던진다.
  • 던져진 Exception 을 처리할 수 있는 catch 블록에서 이를 받고 처리한다.
  • 정상적으로 처리되면 try catch 다음 문장으로 넘어간다.
try {
} catch (Exception e) {
} catch (XXException e) {
}
  • XXException 역시 Exception에서 처리된다. 상위 타입이 먼저 선언되었기 때문에
  • 에러 처리에도 다형성 적용

 

Try - Catch - Finally

  • 중간에 return을 만나도 → catch나 try에서도 finally 블록을 먼저 수행 후에 리턴을 실행함.
  • 주로 finally 에는 자원 반납 코드를 사용함.
try {
    // exception이 발생할 만한 코드
} catch {
    // exception 발생 시 처리 코드
} finally {
    // try block에서 접근했던 System 자원의 안전한 원상복구
}
package com.ssafy.live4.exception.install;

public class UseInstaller {
    public static void main(String[] args) {
      // TODO: InstallApp을 이용하면서 자원이 확실히 정리되도록 해보자.

        InstallApp app = new InstallApp();       
        try {
            app.copy();
            app.install();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            app.delete();
        }

        // END:
      System.out.println("설치 종료");

    }
}

throws를 통한 처리 위임

  • method에서 처리해야 할 하나 이상의 예외를 호출한 곳으로 전달
    • 예외가 없어지지 않고 단순하게 전달된다
    • 예외를 전달받은 메서드는 다시 예외 처리의 책임 발생

throw는 예외를 처리

throw : 예외를 처리

throws : 예외를 위임

 

 

사용자 정의 예외

  • API 에 정의되지 않은 사용자 정의 예외 클래스 작성
  • Exception또는 RuntimeException 클래스를 상속받아 작성한다.
    • checked exception 활용: 명시적 예외 처리 또는 throws 필요 ⇒ Exception
    • runtime exception 활용 : 묵시적 예외 처리 가능 ⇒ RuntimeException

장점

  • 객체의 활용 : 필요한 추가정보, 기능 활용 가능
  • 코드의 재사용 : 동일한 상황에서 예외 객체 재사용 가능
  • throws 메커니즘의 이용 : 중간 호출 단계에서 return 불필요

적용 순서

  1. 예외 클래스 만들기
  2. 예외 상황에서 예외 객체 생성하여 던지는 코드 작성
  3. 던져진 예외 상황을 처리

CheckException 예시

  • SQLException
  • IOException
    • FileNotFoundException

RuntimeException 예시

직접 실행해봐야 알 수 있는 예외들

  • ArrayIndexOutOfBoundsException
  • ArithmeticException
  • NullPointerException
  • ClassCastException
    • 적절하지 못한 형 변환을 하는 경우
    • instanceof 를 사용함