어떤 사람들은 당신이 규칙을 따라야한다고 당신을 설득하려고합니다. 하지만 순종 여부는 상황에 따라 결정해야합니다. 현실은 "규칙에 따라 플레이해야합니다"( "규칙에 따라 플레이해야합니다"가 아님). 규칙을 지키지 않으면 결과가 발생할 수 있습니다.
상황은의 상황 Runnable
뿐만 아니라 Java 8에서도 매우 빈번하게 적용되며 검사 된 예외를 처리 할 가능성없이 기능 인터페이스가 도입 된 Streams 및 기타 장소의 컨텍스트에서도 매우 자주 발생합니다. 예를 들어, Consumer
, Supplier
, Function
, BiFunction
등 모두 체크 된 예외를 처리하는 시설없이 선언합니다.
그렇다면 상황과 옵션은 무엇입니까? 아래 텍스트에서는 Runnable
예외를 선언하지 않거나 당면한 사용 사례에 비해 너무 제한적인 예외를 선언하는 기능 인터페이스를 나타냅니다.
- 당신은
Runnable
어딘가에 선언 했고 Runnable
다른 것으로 대체 할 수 있습니다.
- 교체 고려
Runnable
와 함께 Callable<Void>
. 기본적으로 똑같지 만 예외를 던질 수 있습니다. 보유하고 return null
온화한 성가심 끝있다.
- 원하는 예외를 정확히 throw 할 수있는
Runnable
사용자 지정으로 교체 하는 것을 고려하십시오 @FunctionalInterface
.
- API를 사용했으며 대안을 사용할 수 있습니다. 당신이 사용할 수 있도록 예를 들어, 일부 자바 API는 오버로드
Callable<Void>
대신 Runnable
.
- API를 사용했으며 대안이 없습니다. 이 경우에도 여전히 옵션이 없습니다.
- 에서 예외를 래핑 할 수 있습니다
RuntimeException
.
- 체크되지 않은 캐스트를 사용하여 예외를 RuntimeException으로 해킹 할 수 있습니다.
다음을 시도 할 수 있습니다. 약간의 해킹이지만 때로는 해킹이 필요합니다. 왜냐하면 예외를 확인해야하는지 여부를 확인해야하는지 여부는 유형에 따라 정의되지만 실제로는 상황에 따라 정의되어야하기 때문입니다.
@FunctionalInterface
public interface ThrowingRunnable extends Runnable {
@Override
default void run() {
try {
tryRun();
} catch (final Throwable t) {
throwUnchecked(t);
}
}
private static <E extends RuntimeException> void throwUnchecked(Throwable t) {
throw (E) t;
}
void tryRun() throws Throwable;
}
new RuntimeException(t)
스택 추적이 더 짧기 때문에 이것을 선호 합니다.
이제 다음을 수행 할 수 있습니다.
executorService.submit((ThrowingRunnable) () -> {throw new Exception()});
면책 조항 : 이러한 방식으로 확인되지 않은 캐스트를 수행하는 기능은 제네릭 유형 정보가 컴파일 타임뿐만 아니라 런타임에도 처리 될 때 Java의 향후 버전에서 실제로 제거 될 수 있습니다.