何人かの人々はあなたが規則に従ってプレーしなければならないことをあなたに納得させようとします。聞いてください、しかしあなたが従うかどうか、あなたはあなたの状況に応じてあなた自身を決定するべきです。現実は「ルールに従ってプレイする必要がある」(「ルールに従ってプレイする必要がある」ではない)です。ルールに従わないと、結果が生じる可能性があることに注意してください。
この状況は、の状況だけ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の将来のバージョンで実際に削除される可能性があります。