2012-12-15 8 views
9

Questo non viene compilato e restituisce il seguente errore: Illegal start of expression. Perché?Perché non posso lanciare un'eccezione durante l'utilizzo dell'operatore ternario

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

perché 'throw' non è espressione –

+0

"ritorno (throw new RuntimeException (" errore")) ;" - non puoi restituire una nuova eccezione di lancio() –

+0

Il pattern Null Object è degno di nota qui. –

risposta

11

Questo perché un operatore ternario in Java assume il formato expression ? expression : expression e si sta dando una dichiarazione come parte finale. Questo non ha senso in quanto una dichiarazione non dà un valore, mentre le espressioni lo fanno. Cosa deve fare Java quando scopre che la condizione è falsa e prova a dare il secondo valore? Non c'è valore.

L'operatore ternario è progettato per consentire di effettuare rapidamente una scelta tra due variabili senza utilizzare una dichiarazione completa if - non è quello che si sta tentando di fare, quindi non utilizzarlo, la soluzione migliore è semplicemente :

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

L'operatore ternario non è progettato per produrre effetti collaterali - mentre può essere fatto per la loro produzione, persone che leggono non si aspettano che, quindi è molto meglio usare una vera e propria if dichiarazione da fare chiaro.

0

si sta cercando di restituire un throw new RuntimeException("error"). Questo è il motivo per cui stai ricevendo un errore. Perché nel caso true si restituisce AppConfig e nel caso false si restituisce exception.

14

Si può scrivere un metodo di utilità

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

e usarlo in questo modo:

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

Perché non dichiarare 'throwException' come restituire' Object'? – Navin

+0

@Navin Object richiede il cast al chiamante. 'T' non ha bisogno di cast (almeno alcune volte ... a seconda del compilatore). In Java 8 anche '' non è richiesto (il compilatore può capirlo) –

+0

Ah ok, è conveniente :) – Navin

Problemi correlati