> For the complete documentation index, see [llms.txt](https://develop-footprint.gitbook.io/o/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://develop-footprint.gitbook.io/o/java/effective-java/10/item-71.md).

# item 71) 필요 없는 검사 예외 사용은 피하라

## 검사 예외 vs 비검사 예외 vs 빈 옵셔널

* 검사 예외를 던지는 메서드는 스트림 내부에서 직접 사용할 수 없어 부담이 커진다.
* API를 제대로 사용해도 발생할 수 있는 예외이거나, 클라이언트가 의미있는 조치를 취할 수 있는 경우에만 검사 예외를 사용하고, 아니면 비검사 예외를 사용하자.
* 검사 예외를 던지는 대신 **빈 옵셔널을 반환**하면 단순하다. 하지만 예외가 발생한 이유를 알릴 수 없다.
* **예외를 반환**하면 구체적인 예외 타입과 예외 타입이 제공하는 메서드들을 활용해 **부가 정보를 제공**할 수 있다. (item 70)

## 검사 예외를 비검사 예외로 바꾸기

* 이러한 방법은 권장하지 않는다.
* 검사 예외를 던지는 기존 코드이다.

```java
try {
    obj.action(args);
} catch (TheCheckedException e) {
    ...// 예외 상황에 대처한다.
}
```

* 검사 예외를 던지는 메서드를 쪼개서 비검사 예외로 변경한다.
* 아래 예제에서는 예외가 던져질 지 여부를 반환하는 `actionPermitted` 메서드(상태 검사 메서드, item 69)를 사용한다.

```java
if (obj.actionPermitted(args)) {
    obj.action(args);
} else {
    ...// 예외 상황에 대처한다.
}
```

* 혹은 실패 시 스레드를 중단하길 원한다면 아래와 같이 작성해도 무방하다.

```less
obj.action(args);
```

* 하지만 멀티 스레드이거나 상태 검사 중 action 로직을 일부 수행하는 상황이라면, 오류가 나거나 성능 상 손해가 있을 수 있어 이 리팩토링이 적절하지 않다.
