2016-05-01 16 views
20

C'è qualche differenza tra i seguenti due metodi?Ritorno dal metodo, nel blocco "try" o dopo il blocco "catch"?

Quale preferibile e perché?

Prg1:

public static boolean test() throws Exception { 
    try { 
     doSomething(); 
     return true; 
    } catch (Exception e) { 
     throw new Exception("No!"); 
    }  
} 

Prg2:

public static boolean test() throws Exception { 
    try { 
     doSomething(); 
    } catch (Exception e) { 
     throw new Exception("No!"); 
    } 
    return true;  
} 
+2

Mi piace il secondo frammento, poiché lo trovo più pulito (e più chiaro). Non penso che faccia la differenza in termini di prestazioni. – Eran

+1

Mi piace il primo, a causa di cosa succederà se decidi di gestire l'eccezione localmente invece di rilanciarla. – njzk2

risposta

23

Considerare questi i casi in cui non si è di ritorno un'espressione costante:

Caso 1:

public static Val test() throws Exception { 
    try { 
     return doSomething(); 
    } catch (Exception e) { 
     throw new Exception("No!"); 
    } 
    // Unreachable code goes here 
} 

Caso 2:

public static Val test() throws Exception { 
    Val toReturn = null; 
    try {    
     toReturn = doSomething(); 
    } catch (Exception e) { 
     throw new Exception("No!"); 
    } 
    return toReturn; 
} 

io preferirei il primo. Il secondo è più dettagliato e potrebbe causare confusione durante il debug.

Se test() restituisce erroneamente null, e si vede toReturn essere inizializzato a null, si potrebbe pensare che il problema è in test() (soprattutto quando test() non è solo un semplice esempio come questo).

Anche se può restituire solo null se doSomething restituisce null. Ma potrebbe essere difficile da vedere a colpo d'occhio.


Si potrebbe quindi sostenere che, per ragioni di coerenza, è meglio sempre utilizzare la prima forma.

4

No non c'è differenza tra entrambi i metodi. Restituirà il valore true in entrambi i casi in modo efficace riprendendo il flusso del programma non appena viene gestita un'eccezione. È possibile accedere alla cattura solo quando si verifica un'eccezione.

-5

Non c'è differenza, ma il primo Prg1 è più veloce del Prg2.

+0

Qualche prova di ciò? –

+0

utilizzando questo codice è possibile provarlo: \t long startTime, endTime, duration; \t \t startTime = System.nanoTime(); \t \t test2(); // or test1() \t \t endTime = System.nanoTime(); – ABBOne

+2

non è un buon metodo di benchmarking di un'applicazione –

3

Non c'è alcuna differenza funzionale. Entrambi i programmi si comportano allo stesso modo. È solo una questione di stile di codifica e gusto personale.

Come buona pratica, è meglio avere una singola dichiarazione di ritorno per metodo - alla fine del metodo, anziché in-between. Nel caso di lunghi blocchi di codice, questo stile rende il codice più leggibile e più mantenibile in futuro quando l'autore (originale o qualcun altro) deve apportare modifiche al codice.

Quindi, il primo viene considerato migliore dal punto di vista delle buone pratiche.

+3

Potrebbe per favore interrompere il riciclaggio di questa antica saggezza che non è più rilevante stackoverflow.com/questions/36707/should-a -funzione-have-solo-un-ritorno-statement –

2

Sto assumendo che questa è una domanda generale. Altrimenti potrei commentare altri aspetti dei tuoi metodi.

Penso che nel caso o in piccoli metodi come questi non ha molta importanza. Il metodo è abbastanza breve per capire immediatamente cosa sta succedendo, cosa è correlato a cosa ecc.

Tuttavia, nel caso di metodi più lunghi, il flusso è molto più semplice da seguire nel primo esempio. Secondo me. Mantiene insieme il codice correlato e gli scenari correlati. Quando stai leggendo il metodo, il normale flusso di esecuzione non viene interrotto dal blocco catch, rendendolo più ovvio e "fluente".

public static boolean test() throws Exception { 
    try { 
     doSomething(); 
     return true; 
    } catch (Exception e) { 
     throw new Exception("No!"); 
    }  
} 

Ma non generalizzerò questo per tutti i metodi; è tutto sul contesto.

Problemi correlati