何人かの人々はあなたが規則に従ってプレーしなければならないことをあなたに納得させようとします。聞いてください、しかしあなたが従うかどうか、あなたはあなたの状況に応じてあなた自身を決定するべきです。現実は「ルールに従ってプレイする必要がある」(「ルールに従ってプレイする必要がある」ではない)です。ルールに従わないと、結果が生じる可能性があることに注意してください。
この状況は、の状況だけRunnable
でなく、Java 8でも、チェックされた例外を処理する可能性なしに機能インターフェイスが導入されたStreamsやその他の場所のコンテキストで非常に頻繁に当てはまります。たとえば、、、、などConsumer
はすべてSupplier
、チェックされた例外を処理する機能なしで宣言されています。Function
BiFunction
では、状況とオプションは何ですか?以下のテキストでRunnable
は、は、例外を宣言しない、または手元のユースケースに対して制限が多すぎる例外を宣言する機能インターフェイスを表しています。
- あなたは
Runnable
自分のどこかで宣言し、Runnable
他のものに置き換えることができます。
- に置き換えること
Runnable
を検討してくださいCallable<Void>
。基本的に同じことですが、例外をスローすることができます。そしてreturn null
最後にやらなければならない、それは穏やかな迷惑です。
- 必要な例外を正確にスローできる
Runnable
独自のカスタムに置き換えることを検討してください。@FunctionalInterface
- APIを使用しましたが、代替手段を利用できます。たとえば、一部のJava 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の将来のバージョンで実際に削除される可能性があります。