Java 문법 9. Exception 예외 처리

작성일     업데이트:

카테고리:

태그:

예외 처리

프로그래밍 오류(에러)

프로그램 수행 시 치명적 상황이 발생하여 비정상 종료 상황이 발생한 것으로 발생 시점에 따라 컴파일, 런타임, 시스템 에러 세가지로 구분 가능하다

  • 컴파일 에러

    • 소스 컴파일 시에 발생하며 주로 문법적인 에러이다
    • 에러가 발생된 소스 코드를 수정해야 한다
  • 런타임 에러

    • 프로그램 실행 도중에 발생하며 잘못된 값의 입력 등 수행할 수 없는 작업을 시도할 경우에 발생한다
    • 소스코드로 에러 발생 구문을 수정해야 한다
  • 시스템 에러

    • 컴퓨터 시스템 상에 발생하는 오동작에 의한 에러로 소스 코드로는 해결할 수 없는 장비 또는 운영체제 관련 에러이다
    • 소스코드 수정으로는 해결할 수 없다


예외 (Exception)

소스 코드 수정으로 해결 가능한 에러를 예외(exception)라고 하는데 자바는 런타임 에러를 에러(error) 와 예외(exception)로 구분한다

  • 에러

    • 프로그램 소스 코드 수정으로 해결할 수 없는 경우를 말하며 복구할 수 없는 심각한 경우이다
  • 예외(예측 가능한 에러)

    • 소스 코드 수정으로 해결할 수 있는 에러를 말하며 발생하더라도 해결할 수 있다

예외는 아래처럼 크게 두가지로 구분된다

  • Unchekced Exception

    • RuntimeException이나 그 후손들이 속한 예외로 소스 코드 상에서 처리를 해주지 않아도 되는 예외들이다
      => 프로그래머의 부주의로 인한 오류인 경우가 많아, 코드를 수정해야 하는 경우가 많기 때문이다
    • RuntimeException 후손 클래스 종류
      • ArithmeticException : 0으로 나누는 경우 발생
      • ArrayIndexOutOfBoundsException : 배열의 index범위를 넘어서 참조하는 경우 발생
      • NegativeArraySizeException : 배열 크기를 음수로 지정한 경우 발생
      • ClassCastException : Cast연산자 사용시 타입 오류 발생
      • NullPointerException : Null인 참조 변수로 객체 멤버 참조 시도 시 발생
  • Checked Exception

    • RuntimeException 외의 예외들로 소스 코드로 반드시 예외처리(Exception Handling)를 해주어야 한다


예외 처리 (Exception Handling)

예외가 발생되면 프로그램은 비정상적으로 종료하게 되며,
만약 프로그램이 종료되지 않게 실행의 흐름을 바꾸고자 한다면 직접 예외를 처리해주면 된다

이러한 예외처리용 구문에는 크게 세가지가 있다


[ try ~ catch ~ finally ]

try {
// 예외 발생 가능성이 있거나, 예외를 반드시 처리해야 하는 코드 작성부
} catch (처리할 예외클래스명 객체 1) {
// 예외 상황 1에 대한 처리 코드
} catch (처리할 예외클래스명 객체 2) {
// 예외 상황 2에 대한 처리 코드
} finally {
// 예외 발생으로 try { } 안의 코드가 중단되더라도 반드시 실행해야 하는 코드
}
  • 예외가 발생한 곳에서 직접 처리해주고 싶을 때 사용하는 구문
  • finally 구문은 예외가 발생하든 발생하지 않는 무조건 구동되어야 하는 코드를 작성하는 영역이다
  • 하나 이상의 catch문을 사용할 경우에는 반드시 처리할 예외클래스들의 상속관계를 고려하여 최하위 후손 클래스부터 기술해 주어야 한다
    => if문처럼 위에서부터 예외 케이스를 확인하기 때문
  • 발생한 예외에 대한 정보 확인 방법(catch문 안에 작성)
    • 예외객체.toString() : 에러 객체 직접 출력
    • 예외객체.getMessage() : 에러 객체 메세지 출력
    • 예외객체.printStackTrace() : 실행 흐름상의 예외 발생 단계를 추적하여 출력


[ try with resource ]

try ( 추후 close 해야할 객체 생성  초기화 ) {
// 예외 발생 가능성이 있거나, 예외를 반드시 처리해야 하는 코드 작성부
} catch (처리할 예외클래스명 객체 1) {
// 예외 상황 1에 대한 처리 코드
} catch (처리할 예외클래스명 객체 2) {
// 예외 상황 2에 대한 처리 코드
} finally {
// 예외 발생으로 try { } 안의 코드가 중단되더라도 반드시 실행해야 하는 코드
}
  • 자바 7에서 추가된 기능으로 fimally에서 작성했던 close처리를 try문에서 자동으로 하게 되었다
  • 그 외 동작은 위의 try ~ catch ~ finally와 동일하다


[ throws ]

public void method() throws IOException { }
  • 예외발생 시 해당 메소드를 호출한 상위 메소드에게 처리를 위임(떠넘기는)하는 구문
    => 계속해서 위임할경우 main()메소드까지 위임하게 되고 거기서도 처리되지 않을경우엔 비정상 종료된다
  • 메소드 선언 시 throws 예외클래스명을 추가하여 사용한다
    => 해당 메소드 안에서 기술해놓은 예외클래스명에 속하는 예외가 발생되면 상위 메소드에게 위임한다
  • 만일 해당 메소드를 자식 클래스에서 오버라이딩 하게 된다면 던지는 예외가 부모보다 작거나 같아야 한다 (= 부모보다 더 큰 예외를 던질수는 없다)


[ throw ]

public void method() {
  throw new IOException();
  //Exception 발생
}
  • 인위적으로 예외를 발생시킬 수 있는 구문이다
  • 원하는 예외 객체를 생성하여 발생시킬 수 있다


사용자 정의 예외클래스 만들기

public class UserException extends Exception {
  private Integer number = null

  public UserException() {}

  public UserException(String msg) {
    super(msg);
  }

  @Override
  public String getMessage() {
    if(number == null) {
      return "숫자가 아닙니다";
    }
  }
}
public class UserExceptionTest {
  public void method() {
    throw new UserException("예외발생");
  }
}
  • 위와같이 직접 예외클래스를 상속받아 사용자 정의 예외클래스를 만들 수 있다
  • Exception이 발생하는 곳에서 throw new 사용자정의예외클래스명() 으로 발생시킬 수도 있다
    => 이때 생성자에 원하는 메세지를 입력하면 에러문구에 해당 메세지가 같이 입력되어 뜨게 된다

댓글남기기