[Java] 예외와 오류

HyeBin, Park·2022년 5월 9일
0
post-thumbnail

🧵 Java의 예외와 오류

🍔 Throwable

  • 예외와 오류는 모두 Throwable 상속받습니다.
  public static void main(String[] args) {
        int []arr = new int[2];

        try {
            arr[2] = 1;
        } catch (ArrayIndexOutOfBoundsException e) {
            log.error("------- e -------" + e);
            log.error("------- e.getMessage() ------- " + e.getMessage());
            log.error("------- e.printStackTrace() -------");
            e.printStackTrace();
        }
  }

  • getMessage() : 오류의 원인을 사람이 이해하기 쉬운 형태
  • printStackTrace() : 예외 메세지의 발생 근원지를 찾아 단계별로 출력 -> 가장 자세함

🌽 오류 (Error)

public class Test {
    public static void main(String[] args) {
        print("ERROR");
    }

    private static void print(String error) {
        print(error); // StackOverflowError !! 
    }
}
  • 시스템 레벨에서 발생하는 개발자가 수습할 수 없는 심각한 문제
  • 개발자가 미리 예측하여 방지할 수 없음
  • ex ) OutOfMemoryError, StackOverflowError 등등

🧀 예외 (Exception)

  • 개발자가 구현한 로직에서 발생한 실수에 의해 발생
  • 개발자가 미리 예측하여 방지할 수 있어 상황에 맞는 예외 처리 필요
  • 예외는 catch, throw, throws 할 수 있다.

🤾‍♀️ throw (예외 고의로 던지기)

throw new Execption;
  • 정보를 주기 위해서 -> 예외가 없다면 비정상적으로 종료되고 당시 어떤 일이 일어났는지 정보를 알 수 없음
  • ex) user를 save 하기전에 이미 등록된 사용자가 있으면 예외를 던져버린다.

🏌️‍♀️ throws (예외 떠넘기기)

public void methodB() throws Exception {
	// Exception 발생 
}

public void methodA {
	try{
    	methodB();
    } catch(Exception e) {
    	// e 
    }
}
  • catch로 잡지않고 현재 메서드를 호출한 메서드로 예외를 떠넘김

🤷‍♀️ 왜?

  • 메서드 선언부에 선언된 throws문을 통해 어떤 예외가 발생할 수 있는지 예측할 수 있다.

  • 현재 메서드 내에서 예외 처리를 할 필요가 없다고 판단했을 경우
    -> 팀원들이 내가 만든 메서드를 사용하는 경우, 팀원마다 예외를 다르게 처리할 수 있다.

🎐 자바 표준 예외

👓 이 코드는 잘 돌아갈까요?

🎇 펑 ! UnsuppoertedOperationException

  • java.util.Arrays.ArrayList 클래스는 set(), get(), contains() 메서드를 가지고 있습니다.
    -> 즉, remove는 지원하지 않음
    -> 예외 발생 ! 주로 asList를 사용하다가 많이 보는 예외입니다 !

🍍 자바 예외 계층

text

effective java 아이템 72

  • Exception, Throwable, Error, RuntimeException 은 직접 재사용하지 말자. 이 클래스들은 추상 클래스라고 생각하길 바란다. 이 예외들은 다른 예외들의 상위 클래스이므로 안정적으로 테스트할 수 없다.

reference

0개의 댓글