1. ホーム

[解決済み】Java 8:ストリームで例外をスローするメソッドを操作するにはどうすればよいですか?

2022-04-18 10:43:12

質問

クラスとメソッドがあるとします。

class A {
  void foo() throws Exception() {
    ...
  }
}

のインスタンスごとに foo を呼び出したい。 A のようなストリームで配信される。

void bar() throws Exception {
  Stream<A> as = ...
  as.forEach(a -> a.foo());
}

質問です。例外を適切に処理するにはどうしたらよいですか?foo() が投げる可能性のある例外を処理していないので、私のマシンではコードがコンパイルされません。その throws Exceptionbar は、ここでは役に立たないようです。なぜでしょうか?

どのように解決するのですか?

メソッド呼び出しを別のメソッドにラップする必要があります。 チェック済み例外 . のサブクラスであるものは、まだ投げることができます。 RuntimeException .

通常のラッピングのイディオムは、次のようなものです。

private void safeFoo(final A a) {
    try {
        a.foo();
    } catch (Exception ex) {
        throw new RuntimeException(ex);
    }
}

(スーパータイプ例外 Exception のみ は例として使用し、決して自分で捕捉しようとしないでください)

で呼び出せばいい。 as.forEach(this::safeFoo) .