JAVA/자바의 정석

[자바의 정석 - 기초편] 8. (2) 예외 발생시키기 / checked예외 / unchecked예외 / 사용자 정의 예외 / 예외 되던지기 / 연결된 예외

서영22 2023. 12. 2. 03:56

 예외 발생시키기 

1. 연산자 new를 이용해서 발생시키려는 예외 클래스의 객체 생성

 

2. 키워드 throw를 이용해서 예외 발생

 

Exception e = new Exception("고의로 발생시켰음");      
throw e;  // 예외를 발생시킴

throw new Exception("고의로 발생시켰음");  // 위의 두줄을 한줄로

 

 

 

 checked예외 

컴파일러가 예외 처리 여부를 체크

 

 

- 예외 처리 (try-catch) 필수

 

- Exception과 자손

 

 

 

 

 

 unchecked예외 

컴파일러가 예외 처리 여부를 체크 안함

 

 

- 예외 처리 (try-catch) 선택

 

- RunTimeException과 자손

 

 

 

 

 

 메서드에 예외 선언하기 

예외를 처리하는 방법

 

1. try - catch문

2. 예외 선언하기 (예외 떠넘기기, 알리기)

 

 

예외 선언하기

- 메서드가 호출시 발생가능한 예외를 호출하는 쪽에 알리는 것

void method() throws Exception1, Exception2, ... ExceptionN {
       // 메서드의 내용
}

// method()에서 Exception과 그 자손 예외 발생 가능 (모든 예외)
void method() throws Exception {
       // 메서드의 내용
}

 

 

 

< 예제  1 >

 

 

main 메서드까지 예외를 처리하지 못해서 JVM 기본 예외 처리기가 printStackTrace() 출력함

 

 

 

< 예제  2 >

 

 

파일이름이 " "인 경우 throw 예외 발생 ➔ 예외를 main에게 넘김 ➔ Exception이므로 try-catch 로 처리

 

 

 

 finally 블럭 

예외 발생여부와 관계없이 수행되어야 하는 코드를 넣음

 

 

 

 

 사용자 정의 예외 만들기 

직접 예외 클래스를 정의하는 것

 

 

- 조상은 ExceptionRunException 중에서 선택

 

- String 매개변수로 받는 생성자 추가

 

 

 

 

 예외 되던지기 (exception re-throwing) 

예외를 처리한 후에 다시 예외를 발생시키는 것

 

호출한 메서드와 호출된 메서드 양쪽 모두에서 예외처리 하는 것 

 

 

 

 

 연결된 예외 (chained exception) 

한 예외가 다른 예외 발생시킬 수 있음

 

예외 A가 예외 B를 발생시키면, A는 B의 원인 예외 (cause exception)

 

Throwable initCause (Throwable csuse)   지정한 예외를 원인 예외로 등록
Throwable getCause ()                               원인 예외를 반환

 

 

 

[ 이유 1 ]

 

여러 예외를 하나로 묶어서 다루기 위해

 

 

 

 

[ 이유 2 ]

 

checked예외를 unchecked예외로 변경하려 할 때

 

 

RunTimeException에 MemoryException을 원인예외로 등록