2014-04-07 3 views
147

Versorgung Ich mag würdeJava 8 Verfahren Referenzen: bieten einen Anbieter eine parametrisierte Ergebnis

java.util.Optional.orElseThrow() 

mit einer Ausnahmetyp verwenden, die für einen Konstruktorparameter fragt. So etwas wie dieses:

orElseThrow(MyException::new(someArgument)) // obviously NOT working 

Gibt es eine Möglichkeit, einen Lieferanten zu erstellen, der meinen Argumentwert übergibt?

+19

Warum bekommen können Sie nicht tun 'orElseThrow (() -> neue MyException (someArgument))'? –

Antwort

289

Sicher. orElseThrow(() -> new MyException(someArgument)).

17

Es scheint, dass Sie nur RuntimeException von der Methode orElseThrow auslösen können. Andernfalls wird eine Fehlermeldung wie MyException cannot be converted to java.lang.RuntimeException

+1

Danke, das hat mich rausgeworfen, wenn ich 'Optional' in groovy benutzt habe. Der Versuch, "Exception" von einer groovigen Closure zu "werfen", aber mit "java.lang.reflect.UndeclaredThrowableException" fehlgeschlagen, wurde durch die Änderung in "RuntimeException" behoben. –

+0

Gut zu wissen. Glücklicherweise verwende ich RuntimeExceptions, aber das ist möglicherweise nicht immer der Fall. – hbobenicio

3
optionalUsers.orElseThrow(() -> new UsernameNotFoundException("Username not found"));