2017-08-24 3 views
7

Ich habe eine Funktion in Kotlin definiert:Wie deklariere ich einen Funktionsparameter, um Funktionen zu akzeptieren, die werfen?

List<Widget> getStaticWidgets() throws IOException; 

ich versuchen, sie wie so zu komponieren:

fun convertExceptionToEmpty(requestFunc:() -> List<Widget>): Stream<Widget> { 
    try { 
     return requestFunc().stream() 
    } catch (th: Throwable) { 
     // Log the exception... 
     return Stream.empty() 
    } 
} 

ich eine Java-Methode mit dieser Signatur definiert haben

Stream<Widget> widgets = convertExceptionToEmpty(() -> getStaticWidgets()) 

Wenn Ich kompiliere ich bekomme diesen Fehler:

Error:(ln, col) java: unreported exception java.io.IOException; must be caught or declared to be thrown

Wie definiere ich meine Funktionsparameter, um eine Funktion zu akzeptieren, die ausgelöst wird?

+0

Sie könnten versuchen, Ihre convertExceptionToEmpty-Funktion mit Anmerkungen zu versehen, um eine IOException auszulösen, die diesen Fehler möglicherweise umgehen könnte. – Piwo

+0

@piwo, ich glaube nicht, dass dies helfen wird, die Ausnahme kommt von '' getStaticWidgets() '' Methode –

Antwort

4

Das Problem ist, dass Java hat checked exceptions aber Kotlin nicht. Der requestFunc-Parametertyp () -> List<Widget> wird der funktionalen Schnittstelle Function0<List<Widget>> zugeordnet, aber der Operator invoke löst keine geprüfte Ausnahme im Kotlin-Code aus.

So können Sie nicht die getStaticWidgets() in Lambda-Ausdruck aufrufen, da es eine IOException wirft, die eine geprüfte Ausnahme in Java ist.

Da Sie beide steuern die Kotlin und Java-Code, ist die einfachste Lösung, um die Parameter-Typ () -> List<Widget>-Callable<List<Widget>>, zum Beispiel zu ändern:

// change the parameter type to `Callable` ---v 
fun convertExceptionToEmpty(requestFunc: Callable<List<Widget>>): Stream<Widget> { 
    try { 
     //     v--- get the `List<Widget>` from `Callable` 
     return requestFunc.call().stream() 
    } catch (th: Throwable) { 
     return Stream.empty() 
    } 
} 

Dann Sie Methode Referenz Expression in Java8 verwenden können, wie weiter Beispiel:

0

Ich fürchte, es gibt nichts, was Sie tun können, aber diese Ausnahme fangen:

Stream<Integer> widgets = convertExceptionToEmpty(() -> { 
     try { 
      return getStaticWidgets(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return null; 
    }); 
Verwandte Themen