2017-03-24 6 views
6

Es gibt eine Methode get(sql) (ich kann es nicht ändern). Diese Methode gibt MyObjects zurück und muss sich in try catch befinden, da JqlParseException dort möglich ist. Mein Code ist:Throw Ausnahme in optional in Java8

String sql = something; 
try{ 
    MyObject object = get(sql); 
} catch(JqlParseException e){ 
    e.printStackTrace(); 
} catch(RuntimeException e){ 
    e.printStackTrace(); 
} 

Ich will versuchen, fangen entfernen und Optional Klasse verwenden, habe ich versucht:

MyObject object = Optional.ofNullable(get(sql)).orElseThrow(RuntimeException::new); 

aber IDE Kraft es versuchen zu fangen. Und für:

MyObject object = Optional.ofNullable(get(sql)).orElseThrow(JqlParseException::new)); 

ist ein Fehler (in IDE) The type JqlParseException does not define JqlParseException() that is applicable. Gibt es eine Möglichkeit zu vermeiden, versuchen, Blöcke zu fangen und optional zu verwenden?

+1

Springe zur Definition von 'get', sehen Sie, ob 'JqlException' heißt. Wenn dies der Fall ist, müssen Sie try ... catch verwenden. – Sweeper

+2

Es scheint, dass ziemlich viele Leute optional als NextGeneration ™ Kontrollflusskonstrukt betrachten. Das wird nicht passieren. Optional, ebenso wie seine primitiven Gegenstücke, kann diese Art von Aufgabe inhärent nicht behandelt werden. Es wurde nicht entwickelt, um Kontrollflusskonstrukte wie If-Else oder Try-Catch vollständig zu ersetzen. Stattdessen konzentriert es sich darauf, diese endlosen Null-Checks loszuwerden. – glee8e

+0

@ glee8e * ['Optional'] konzentriert sich auf die Beseitigung dieser endlosen Null-Checks. * Ich wäre genauer. Viele Leute würden zu dem Schluss kommen, dass sie alle Vorkommen von "Null" durch "Optional" ersetzen sollten, was gegen die Absicht der Designer von "Optional" verstößt. – Jubobs

Antwort

7

Optional ist nicht wirklich für den Zweck der Behandlung von Ausnahmen gedacht, es sollte mit möglichen Nullen umgehen, ohne den Fluss Ihres Programms zu brechen. Zum Beispiel:

myOptional.map(Integer::parseInt).orElseThrow(() -> new RuntimeException("No data!"); 

Dies wird den map Schritt automatisch überspringen, wenn die optionalen leer war und das Recht auf den throw Schritt gehen - ein schönen ungebrochenen Programmablauf.

Wenn Sie schreiben:

myOptionalValue.orElseThrow(() -> new RuntimeException("Unavailable")); 

... was Sie wirklich sagen, ist: mein optional Rückgabewert, sondern eine Ausnahme aus, wenn es nicht verfügbar ist.

Was Sie scheinen zu wollen, ist eine Möglichkeit, ein optionales zu erstellen (das sofort die Ausnahme abfängt) und diese Ausnahme erneut auslöst, wenn Sie das optionale verwenden.

4

So funktioniert Optionals nicht. Sie machen Try-Catch-Blöcke nicht überflüssig. Sie können jedoch eine neue Wrapper-Funktion wie folgt vorstellen:

public Optional<MyObject> getMyObject(final String jql) { 
    try { 
     return Optional.ofNullable(get(sql)); 
    } catch (final JqlParseException e) { 
     return Optional.empty(); 
    } 
} 

Sie werden nicht mehr mit der Ausnahme zu tun haben, aber Sie werden nicht wissen, ob es ein Fehler war, wenn Sie eine leere Optional erhalten als Gut.