korean IT student

[Java-Live-Study] 9주차 - 예외 처리 본문

back-end/JAVA

[Java-Live-Study] 9주차 - 예외 처리

현창이 2021. 11. 3. 15:01

목표

자바의 예외 처리에 대해 학습하세요.

학습할 것 (필수)

  • 자바에서 예외 처리 방법 (try, catch, throw, throws, finally)
  • 자바가 제공하는 예외 계층 구조
  • Exception과 Error의 차이는?
  • RuntimeException과 RE가 아닌 것의 차이는?
  • 커스텀한 예외 만드는 방법

 

 

예외(Exception)와 에러(Error)

Exception

  • 프로그램 실행 중 개발자가 구현한 로직에서 던져진 문제에 대한 정보를 담는 클래스를 말하며, 자바에서의 Exception은 컴파일 시점에서 컴파일러에게 발견되는 확인된 예외이다.
  • 예외 처리를 통해 프로그램을 종료하지 않고 정상 실행 상태가 유지되도록 할 수 있다.

Error

  • 컴퓨터 하드웨어의 오동작 또는 고장으로 인해 응용프로그램 실행 오류가 발생하는 것을 자바에서는 error라고 한다.
  • 에러는 메모리 부족, 스택오버플로우처럼 JVM이나 하드웨어 등의 기반 시스템 문제로 발생
  • 발생하면 무조권 프로그램은 비정상 종료되기 때문에 애초에 발생하지 않도록 해야 한다.

자바가 제공하는 예외 계층 구조

  • 모든 예외의 조상이 되는 Exception 클래스와 모든 오류의 조상이 되는 Error 클래스의 부모 클래스이다.
  • String getMesage(), void printStackTrace(), String toString() 메소드가 포함된다.
  • Exception을 상속받은 클래스들 중에서 RuntimeException을 제외하고 모두를 Unchecked Exception이라고 한다.

Checked Exception

  • Checked Exception은 컴파일 시점에서 확인할 수 있는 예외처리이다.
  • 만약 코드 내에서 Checked Exception이 발생한다면, 반드시 try-catch로 처리하거나 throws를 사용하여 호출한 고승로 처리를 넘겨야한다.

Unchecked Exception

  • 컴파일 단계에서 확인할 수 없는 예외 - RuntimeException

그럼 Runtime Exception은 왜 예외를 명세하지 않아도 되도록 했을까? Runtime Exception은 프로그램 코드의 문제로 발생하는 예외이다(즉 코드를 짠 개발자의 잘못). 따라서 클라이언트 쪽(메서드를 호출하는 쪽)에서 이를 복구(or 회복)하거나 대처할 수 있을 거라고 예상하긴 어렵다. 또 Runtime Exception은 프로그램 어디서나 매우 빈번하게 발생할 수 있기 때문에 모든 Runtime Exception을 메서드에 명시하도록 강제하는 것은 프로그램의 명확성을 떨어뜨릴 수 있다.

따라서 클라이언트가 exception을 적절히 회복할 수 있을 것이라고 예상되는 경우 checked exception으로 만들고, 그렇지 않은 경우 unchecked exception으로 만드는 것이 좋다.

출처 - https://wisdom-and-record.tistory.com/46

자바에서 예외 처리 방법 (try, catch, throw, throws, finally)

try-catch-finally

try{
    //예외 발생 가능 코드
}catch (예외클래스 e1){
    //예외 처리
}finally{
    //항상 실행
}
  • try 블록에는 예외 발생 가능 코드가 위치하고 예외가 발생하면 catch 블록을 실행한다.
  • 마지막으로 finally 블록이 실행된다.
  • try 블록과 catch 블록에서 return문을 사용하더라도 finally 블록은 항상 실행된다.

다중 catch

try{
    //예외 발생 가능 코드
}catch (예외클래스 e1){
    //예외 처리
}catch (예외클래스 e2){
    //예외 처리
}

예제1)
-- 상위 예외 클래스가 하위 예외 클래스보다 아래쪽에 위치해야 합니다.
-- NullPointerException (하위 예외 클래스)은 Exception (상위 예외 클래스)을 상속
try{
    
}catch(NullPointerException e){
    // null 실행
}catch(Exception e){
    //NullPointerException 이외의 예외 발생시 실행
}
  • try 블록 내부는 다양한 종류의 에러가 일어날 수 있기 때문에 위와 같이 여러 개의 catch 블록을 작성할 수 있다.

멀티 catch

try{
    String person = null;
    System.out.println(person.toString());
}catch ( NumberFormatException | NullPointerException e){
    e.printStackTrace();
}
  • 자바 7부터 하나의 catch 블록에서 여러 개의 예외를 처리할 수 있도록 멀티 catch 기능을 추가했다.
  • 나열된 예외 클래스들이 상속 관계에 있다면 컴파일 불가능주의!!!

throw

        String person = null;
        if(person == null)
        {
            throw new NullPointerException("return value is null at method person");
        }
  • 조건에 부합하면 예외를 직접 발생시킬 수 있다. 
  • 발생시킬 수 있는 예외는 Exception의 최상위 클래스인 Throwable class의 하위 클래스라면 모두 가능

throws

public class CustomException extends Exception{
	CustomException(String msg){
    	super(msg);
    }
}


  public static void main(String[] args) {
      CustomException customException = new CustomException("customException return");
        try {
            throw customException;
        } catch (CustomException e){
            System.out.println(e);
        }

 }
  • 메서드 선언부에 throws 키워드를 통해 해당 메서드를 호출한 메서드에게로 예외를 던진다.
  • 예외를 선언함으로서 메서드를 사용할때 발생할수 있는 에러를 명시적으로 알 수 있다.
  • 이때 예외는 해당메서드를 호출하는 어느곳에서든 한번은 try~catch로 처리해주어야 한다.

 

Comments