2016-08-22 28 views
10

Poniższy kod działa poprawnie:Rzut RuntimeException wewnątrz strumienia z Optional.orElseThrow

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; 
    }) 
    // ... 

Jednak podczas korzystania z opcjonalnego orElseThrow:

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

pojawia się błąd czasu kompilacji:

Error:(129, 33) java: unreported exception X; must be caught or declared to be thrown

Oba wywołują wyjątek RuntimeException, wszelkie pomysły, dlaczego podejście z opcją nie działa?

Aktualizacja: Moja infrastruktura kompilacji, starałem się go skompilować z IntelliJ i 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" 
+0

Jakiej wersji Java używasz? Dla mnie to działa dobrze na Java 8_60 –

+1

Wydaje się być duplikatem http://stackoverflow.com/questions/25523375/java8-lambdas-and-exceptions –

+0

To prawdopodobnie działało dla mnie, ponieważ próbowałem z zaćmieniem. W pokrewnym pytaniu mówią, że błąd w jakiś sposób nie wpływa na zaćmienie. –

Odpowiedz

9

Jest to błąd kompilatora JDK-8047338 które uniemożliwiają prawidłową ogólny typ wyjątku wnioskowanie. Został częściowo rozwiązany w wersji 1.8.0_92.