web-dev-qa-db-ja.com

Optional.orElseThrowを使用してStream内にRuntimeExceptionをスローします

次のコードは正常に機能します。

Stream.of("key1", "key2")
   .map(key -> {
      SomeObject foo = service.find(key);
      if (foo == null) {
         throw new RuntimeException("No entity found with key: " + key);
      }
      return foo;
   })
   // ...

ただし、オプションからorElseThrowを使用する場合:

Stream.of("key1", "key2")
   .map(key -> Optional.ofNullable(someService.find(key))
         .orElseThrow(() -> new RuntimeException("No entity found with key: " + key)))
   // ...

コンパイル時エラーが発生します:

エラー:(129、33)Java:報告されていない例外X;捕まえるか、投げられると宣言する必要があります

どちらもRuntimeExceptionをスローしますが、Optionalを使用したアプローチが機能しない理由はありますか?

更新:ビルドインフラストラクチャ、IntelliJとMavenでコンパイルしようとしました:

$ mvn -version
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-10T17:41:47+01:00)
Maven home: C:\Tools\Apache-maven-3.3.9
Java version: 1.8.0_91, vendor: Oracle Corporation
Java home: C:\Program Files\Java\jdk1.8.0_91\jre
Default locale: de_AT, platform encoding: Cp1252
OS name: "windows 10", version: "10.0", Arch: "AMD64", family: "dos"
14
Journeycorner

これはコンパイラのバグです JDK-8047338 これは正しいジェネリック例外タイプの推論を妨げます。 1.8.0_92リリースで部分的に解決されました。

15
vsminkov