본문 바로가기

Etc../SWExpertAcademy

[Java Programming] 객체지향 핵심 원리(8)

■ 예외 처리

예외(Exception)의 개념

오류

  • Error : 프로그램으로 처리할 수 없어 프로그램이 중단됨
  • Exception : 프로그램 실행 중 발생할 수 있는 가벼운 사건, 프로그램적으로 얼마든 처리할 수 있는 오류

자바에서 예외가 발생하는 경우

  • 정수를 0으로 나누는 경우 (ArithmeticException)
  • 배열의 인덱스가 음수인 경우
  • 배열의 인덱스가 배열의 길이를 넘어서는 경우 (ArrayIndexOutOfBoundsException)
  • 부적절한 형변환이 발생하는 경우
  • 입출력 시 Interrupt가 발생하는 경우
  • 입출력을 위해 필요한 파일이 존재하지 않는 경우 (IOException)

예외 발생 시 처리 과정

  1. 프로그램 실행 중 예외 발생
  2. JVM은 해당 예외 상황의 해당 예외 객체를 생성하여 프로그램으로 throw
  3. 프로그램은 JVM이 throw한 예외객체를 catch하여 예외처리 로직 수행
  4. 프로그램 계속 진행
  • 자바는 객체지향 언어이므로 예외도 객체로 처리
  • 발생 가능성이 있는 모든 예외 상황을 미리 예측하여 다양한 예외 클래스를 제공

예외 처리 로직을 구현하지 않은 경우

기본 예외 처리 핸들러가 에러메시지를 화면에 출력하고 실행을 중지시킴



예외 클래스

  • java.lang.Throwable : 예외 최상위 클래스

    • java.lang.Error : 처리할 수 없는 치명적인에러 처리

    • java.lang.Exception : 정상적인 프로그램 동작 시 만날 수 있는 오류 처리, 모든 예외 클래스의 부모 클래스

    • java.lang.ClassNotFoundException
    • java.lang.cloneNotSupportedException
    • java.lang.InstantiationException
    • java.io.IOException
    • java.lang.RuntimeException
    • java.lang.IllegalArgumentException
    • java.lang.ArithmeticException
    • java.lang.ArrayIndexOutOfBoundsException
  • RuntimeException : 실행 시에 발생하는 예외, 프로그램이 예외를 다루는 소스코드를 포함하지 않아도 컴파일러가 컴파일을 해줌

  • RuntimeException의 자식 클래스는 예외 처리를 포함하지 않아도 컴파일이 되는 예외 클래스

  • RuntimeException이 아닌 나머지 예외 클래스는 예외처리 로직이 없으면 컴파일 X

  • 예외 클래스는 이름만으로 어떤 의미의 예외인지 알 수 있도록 작성됨.



예외 처리

  • 예외 처리 기능은 자바 언어를 더욱 강하게 만드는 요인
  • 예외가 발생한 메서드 내에서 직접 처리하는 방식 (try-catch, 다중 catch블록, 상속을 이용한 예외처리, finally)
  • 해당 메서드를 호출한 곳으로 예외 처리를 넘기는 방식 (throws예약어)

try-catch / finally

try{
    // 예외 발생 가능성이 있는 소스코드;
}catch(예외타입1 매개변수명1){
    // 예외타입의 예외가 발생할 경우 수행될 소스코드
}catch(예외타입2 매개변수명2){
    // 예외타입의 예외가 발생할 경우 수행될 소스코드
}catch(Exception e){
    // 지정하지 않은 예외타입의 예외가 발생할 경우 수행될 소스코드
    // 반드시 맨 catch구문의 맨 마지막에 위치해야함.
}finally{
       // 필수 X, 프로그래머의 편의에 따라 사용함
       // 예외발생 여부와 관계없이 무조건 수행 될 소스코드
}
  • try블록은 최소한 하나의 catch블록 필요

  • catch블록은 try블록 다음에 위치

  • catch블록의 매개변수는 예외 객체가 발생했을 때 참조하는 변수명으로, 반드시 java.lang.Throwable 클래스의 하위 클래스 타입으로 선언되어야 함

  • 예외가 발생하면 try블록 내의 나머지 문장은 수행되지 않고 JVM이 해당 예외 객체를 발생시킴

  • 발생한 예외 객체 타입에 해당하는 catch블록을 수행함



throws 예약어

  • 예외가 발생한 메서드를 호출한 지점으로 예외를 전달하여 처리
[modifiers] returnType 메서드명([argType argName,...]) [throws exceptionName1, ...]
  • 발생된 예외 객체가 RuntimeException의 자식 클래스인 경우 명시적으로 throw문을 작성하지 않아도 자동으로 throws 됨

  • 메서드가 호출된 곳에 try-catch구문을 작성하여 메서드에서 예외가 발성하더라도 예외를 처리하는 로직을 수행할 수 있도록 함



■ 사용자 정의 예외

  • 개발자가 예외를 직접 정의하는 것
  • 최상위 예외 클래스인 java.lang.Exception 클래스를 상속받아 정의함
class 예외클래스명 extends Exception{}
  • 지정한 예외 상황이 발생하면 throw new 예외클래스명(); 을 이용하여 예외를 발생시키고 try-catch구문을 이용하여 예외 처리를 해야함







[참고] : SWExpertAcademy