Java8 ラムダと例外
2023-09-07 07:18:13
質問
どなたか、次のような奇妙なことを説明していただけないでしょうか。私は、Java 8 update 11 を使用しています。
このメソッドが与えられると
private <F,T> T runFun(Function<Optional<F>, T> fun, Optional<F> opt) {
return fun.apply(opt) ;
}
まず関数Objectを作り、それを上のメソッドに渡すと、コンパイルされます。
private void doesCompile() {
Function<Optional<String>, String> fun = o -> o.orElseThrow(() -> new RuntimeException("nah"));
runFun(fun, Optional.of("foo"));
}
しかし、この関数をラムダとしてインライン化すると、コンパイラは次のように言います。
未報告の例外X; キャッチするか、スローされるように宣言する必要があります。
private void doesNotCompile () {
runFun(o -> o.orElseThrow(() -> new RuntimeException("nah")), Optional.of("foo"));
}
更新 : エラーメッセージはmavenによって省略されていたことが判明しました。javacで直接コンパイルすると、このようなエラーになります。
error: unreported exception X; must be caught or declared to be thrown
runFun(o -> o.orElseThrow(() -> new RuntimeException("nah")), Optional.of("foo"));
^
where X,T are type-variables:
X extends Throwable declared in method <X>orElseThrow(Supplier<? extends X>)
T extends Object declared in class Optional
また を参照してください。 をご覧ください。
どのように解決するのですか?
私の場合はこれで解決しました。
と書く代わりに
optional.map(this::mappingFunction).orElseThrow(() -> new BadRequestException("bla bla"));
と書きました。
optional.map(this::mappingFunction).<BadRequestException>orElseThrow(() -> new BadRequestException("bla bla"));
明示的な
<BadRequestException>
を追加することで、ラムダのエッジケース(これはかなり厄介です...)に役立ちます。
UPDATE: これは最新のJDKバージョンにアップデートできない場合に備えてのことですが、もしできるのであればした方がいいでしょう...
関連
-
アクセス制限です。タイプ 'Application' は API ではない(必要なライブラリに制限がある)。
-
JAVA_HOME環境変数が正しく定義されていない問題を解決する
-
swagger2 モデルが表示されない モデルが見つからない @ApiModel アノテーションが表示されない問題
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] リフレクションとは何か、なぜ有用なのか?
-
[解決済み] Javaで配列を宣言し、初期化する方法は?
-
[解決済み] Java内部クラスと静的ネストされたクラス
-
[解決済み] Java 8のmap()メソッドとflatMap()メソッドの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
スレッド "main "での例外 java.util.NoSuchElementException in Java 問題解決済み
-
java.sql.SQLException: executeQuery()でデータ操作文を発行できません。
-
型に解決できない エラー解決
-
Git Pull Failed マージされていないファイルがあるため、Pull できません。
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException:5 エラー
-
java.sql.SQLException: 結果セットの開始前
-
List list = new ArrayList(); Error: ArrayList は型に解決できません。
-
Javaがリソースリークに遭遇した:'input'が閉じない 解決方法
-
ecplise プロンプトが表示されます。"選択したものは起動できません。" "最近の起動はありません。"
-
CAS 5.1.8でhttpをサポートし、認証されていない認可サービスエラーのプロンプトが表示される問題を解決した。