Checked 예외 vs Unchecked 예외

☕ Ex01.java

		//  💡 RuntimeException 과 그 자손들 : unchecked 예외
		//  - 주로 개발자의 실수로 일어나는 예외 (실수 안 하면 됨)
    //  - 예외처리가 필수가 아님 (하지 않아도 컴파일 가능)
    public static void maybeException1 () {
        if (new Random().nextBoolean()) {
            throw new RuntimeException();
        }
    }
		//  ⚠️ 다른 예외들은 checked 예외
    //  - 해당 메소드 내에서, 또는 호출한 곳에서 예외처리 필수
    //  - 외적 요인으로 발생하는 예외 (조심해도 소용없으므로 대비해야 함)
    //  - ⭐️ IDE의 안내에 따라 두 가지 옵션 실행해보기
    public static void maybeException2 () {
        if (new Random().nextBoolean()) {
            throw new FileNotFoundException();
        }
    }

예외를 메소드 외부로 떠넘기기

☕ WrongMonthException.java

public class WrongMonthException extends Exception {
    public WrongMonthException(String message) {
        super(message);
    }

		public WrongMonthException(String message, Throwable cause) {
        super(message, cause);
    }
}

☕ Ex02.java

		//  💡 예외를 던질 가능성이 있지만 스스로 처리하지는 않는 메소드
    public static void registerDutyMonth (String name, int month) throws WrongMonthException {
        if (month < 1 || month > 12) {
            throw new WrongMonthException("하... 직원 교육 좀 시켜서 보내세요.");
        }
        System.out.printf("%s씨 %d월 담당으로 배정되셨어요.%n", name, month);
    }
				Map<String, Integer> dutyRegMap = new HashMap<>();
        dutyRegMap.put("정핫훈", 7);
        dutyRegMap.put("김돌준", 13);

        dutyRegMap.forEach((name, month) -> {

            //  💡 실행부에서, 혹은 또 이를 호출한 외부에서 처리해주어야 함
            try {
                registerDutyMonth(name, month);
            } catch (WrongMonthException we) {
                we.printStackTrace();
                System.out.printf("%s씨 에어팟 빼봐요.%n", name);
            } catch (Exception e) {
                e.printStackTrace();
            }
        });