1. ホーム
  2. java

Java 8 のメソッド参照で処理されない例外

2023-10-06 12:12:50

質問内容

私はJava 8を使ったプロジェクトに取り組んでいますが、理解できない状況を1つ見つけました。

私はこのようなコードを持っています。

void deleteEntity(Node node) throws SomeException {
    for (ChildNode child: node.getChildren()) {
       deleteChild(child);
    }
}

void deleteChild(Object child) throws SomeException {
    //some code
}

このコードは問題なく動作していますが、メソッド参照で書き換えることができますね。

void deleteEntity(Node node) throws SomeException {
    node.getChildren().forEach(this::deleteChild);
}

そして、このコードはコンパイルされず、次のようなエラーが発生します。 Incompatible thrown types *SomeException* in method reference .

また、IDEAは次のようなエラーを出しました。 unhandled exception .

そこで質問ですが、なぜでしょうか?なぜfor eachループのコードはコンパイルされ、lambdaのコードはコンパイルされないのでしょうか?

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

もし、あなたが Consumer<T> インターフェースを見ると accept メソッド (このメソッド参照が事実上使用しているものです) はチェックされた例外をスローするように宣言されていません。 であるメソッド参照は使用できません。強化されたforループは問題ありません。なぜなら、そこでは常に SomeException を投げることができるからです。

チェックされた例外をチェックされていない例外に変換するラッパーを作成し、それを投げることができる可能性があります。あるいは、独自の関数インターフェイスを accept() メソッドで を行う はチェックされた例外を投げます(おそらくその例外でインターフェースをパラメータ化します)、そして、あなた自身の forEach メソッドを書いてください。