2012-12-15 25 views
9

Nie zostanie skompilowany i pojawi się następujący błąd: Illegal start of expression. Czemu?Dlaczego nie można rzucić wyjątku podczas korzystania z potrójnego operatora

public static AppConfig getInstance() { 
     return mConfig != null ? mConfig : (throw new RuntimeException("error")); 
    } 
+4

ponieważ 'throw' nie jest wyrazem –

+0

"return (throw new RuntimeException (" Error")) ; " - nie można zwrócić rzut nowego wyjątku() –

+0

Należy zwrócić uwagę na wzór obiektu zerowego. –

Odpowiedz

11

Wynika to z faktu, że operator potrójny w języku Java przyjmuje postać expression ? expression : expression, a użytkownik wydaje oświadczenie jako ostatnią część. To nie ma sensu, ponieważ instrukcja nie daje wartości, a wyrażenia to robią. Co to jest Java, gdy robi się to, gdy warunek jest fałszywy i próbuje podać drugą wartość? Nie ma żadnej wartości.

Operator trójskładnikowy umożliwia szybkie dokonanie wyboru między dwiema zmiennymi bez użycia pełnego oświadczenia if - to nie jest to, co próbujesz zrobić, więc nie używaj go, najlepszym rozwiązaniem jest po prostu :

public static AppConfig getInstance() { 
    if (mConfig != null) { 
     return mConfig; 
    } else { 
     throw new RuntimeException("error"); 
    } 
} 

operator trójargumentowy nie jest przeznaczony do wywarcia skutków ubocznych - Choć może to być wykonane do ich produkcji, ludzie czytać nie będzie oczekiwać, że tak jest znacznie lepiej użyć prawdziwego if oświadczenie, aby To jasne.

0

Próbujesz zwrócić throw new RuntimeException("error"). Właśnie dlatego dostaniesz błąd. Ponieważ w przypadku true wracasz AppConfig oraz w przypadku, gdy wracasz exception.

14

Możesz napisać metodę użytkową

public class Util 
{ 
    /** Always throws {@link RuntimeException} with the given message */ 
    public static <T> T throwException(String msg) 
    { 
     throw new RuntimeException(msg); 
    } 
} 

i używać go tak:

public static AppConfig getInstance() 
{ 
    return mConfig != null ? mConfig : Util.<AppConfig> throwException("error"); 
} 
+0

Dlaczego nie zadeklarować 'throwException' jako zwracającego' Object'? – Navin

+0

@Navin Obiekt wymaga rzutowania na dzwoniącego. 'T' nie potrzebuje rzutowania (przynajmniej kilka razy ... w zależności od kompilatora). W języku Java 8 nawet '' nie jest wymagane (kompilator może to zrozumieć) –

+0

Ach, ok, to jest wygodne :) – Navin

Powiązane problemy