예외의 종류
- 확인된 예외(Checked Exception)
- 컴파일 시점에 확인하는 예외
- 필수적 예외 처리
- 미확인된 예외(Unchecked Exception)
- 런타임 시점에 확인되는 예외
- 선택적 예외 처리
원인 예외를 다루기 위한 Method
- initCause(): 지정한 예외를 원인 예외로 등록하는 method
- getCause(): 원인 예외를 반환하는 method
// 연결된 예외 public class main { public static void main(String[] args) { try { NumberFormatException ex = new NumberFormatException("가짜 예외이유"); // 예외 생성 ex.initCause(new NullPointerException("진짜 예외이유")); // 원인 예외 설정(지정한 예외를 원인 예외로 등록) throw ex; // 예외를 직접 던짐 } catch (NumberFormatException ex) { ex.printStackTrace(); // 예외 로그 출력 ex.getCause().printStackTrace(); // 예외 원인 조회 후 출력 } throw new RuntimeException(new Exception("이것이 진짜 예외 이유 입니다.")); // checked exception 을 감싸서 unchecked exception 안에 넣음 } }
- 출력
Caused by: java.lang.NullPointerException: 진짜 예외이유
throw vs throws: 예외가 발생하는 위험한 method임을 알림
class OurClass { private final Boolean just = true; public void thisMethodIsDangerous() throws OurBadException { if (just) { throw new OurBadException(); } } }
- throw: 메서드 안에서 사용하는 예약어
- return처럼 throw 아래의 구문들은 실행되지 않고, throw문과 함께 method가 종료됨
- throws: 메서드 이름 뒤에 붙어 사용하는 예약어
제네릭 문법
public class Generic<T> { private T t; public T get() { return this.t; } public void set(T t) { this.t = t; } public static void main(String[] args) { Generic<String> stringGeneric = new Generic<>(); stringGeneric.set("Hello World"); String tValueTurnOutWithString = stringGeneric.get(); System.out.println(tValueTurnOutWithString); } }
- 제네릭 Class: 제네릭을 사용한 Class
- Generic
- 타입 변수: 제네릭에서 <>사이에 들어가는 변수명
- T
와일드 카드: 제네릭의 제한을 구체적으로 정할 수 있음
public class ParkingLot<T extends Car> { ... } ParkingLot<BMW> bmwParkingLot = new ParkingLot(); ParkingLot<Iphone> iphoneParkingLot = new ParkingLog(); // error!
ㅏ
1. <? extends T> : T와 그 자손들만 사용 가능
2. <? super T> : T와 그 조상들만 가능
3. <?> : 제한 없음
<? extends T>
: T와 그 자손들만 사용 가능<? super T>
: T와 그 조상들만 가능<?>
: 제한 없음