2017-03-24 19 views
6

Istnieje metoda get(sql) (nie mogę jej zmodyfikować). Ta metoda zwraca MyObjects i musi znajdować się w bloku catch catch, ponieważ jest tam możliwe JqlParseException. Mój kod to:Zgłaszanie wyjątków opcjonalnie w języku Java8

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

Chcę usunąć try catch i używać Optional klasę, próbowałem:

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

ale siła nie IDE spróbować złapać zbyt. I:

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

jest błąd (w IDE) The type JqlParseException does not define JqlParseException() that is applicable. Czy jest jakiś sposób na uniknięcie bloków catch i użycie opcji opcjonalnej?

+1

Przejdź do definicji 'get', zobacz, czy jest napisane' throws JqlException'. Jeśli tak, musisz użyć try ... catch. – Sweeper

+2

Wygląda na to, że całkiem sporo osób rozważa Opcjonalnie jako konstrukcję sterowania przepływem NextGeneration ™. To się nie wydarzy. Opcjonalne, jak również jego prymitywne odpowiedniki, z natury rzeczy nie są w stanie sprostać temu zadaniu. Nie jest przeznaczony do całkowitego zastąpienia konstrukcji sterujących przepływem, takich jak if-else lub try-catch. Zamiast tego skupia się na pozbyciu się tych niekończących się czeków zerowych. – glee8e

+0

@ glee8e * ["Opcjonalnie"] koncentruje się na pozbyciu się niekończących się kontroli zerowych. * Byłbym bardziej konkretny. Wielu ludzi doszedłoby do wniosku, że powinni zastąpić wszystkie wystąpienia 'null' opcją' Opcjonalnie', co jest sprzeczne z intencją projektantów 'Opcjonalnych'. – Jubobs

Odpowiedz

7

Optional tak naprawdę nie jest przeznaczony do obsługi wyjątków, miał za zadanie radzić sobie z potencjalnymi zerami bez zakłócania przepływu programu. Na przykład:

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

To automatycznie pominąć krok map jeśli opcja była pusta i przejść od razu do kroku throw - ładnym nieprzerwanego przebiegu programu.

Kiedy piszesz:

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

... czego naprawdę mówią to: Powrót moje dodatkowe wartości, ale wyjątek, jeśli nie jest dostępny.

To, czego oczekujesz, jest sposobem na utworzenie opcjonalnego (natychmiastowo przechwytującego wyjątek) i ponownie zgłosi ten wyjątek, gdy spróbujesz użyć opcji opcjonalnej.

4

Nie tak działają opcje. Nie sprawiają, że try-catch-bloki są przestarzałe. Jednakże, można wprowadzić nowy wrapper-funkcję tak:

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

nie będzie miał do czynienia z wyjątkiem już, ale nie wiem, czy nie było błędu, jeśli się pusta Opcjonalnie jako dobrze.