2011-08-28 11 views
19

Sto lavorando con un'API che afferma di restituire true se ha esito positivo e false se fallisce. Ma sostiene anche di lanciare eccezioni diverse se fallisce. Come può restituire false e generare un'eccezione?Restituisce un valore E genera un'eccezione?

risposta

25

Non è possibile generare un'eccezione e restituire un valore da una singola chiamata di funzione.

Forse fa qualcosa come tornare false se c'è un errore, ma un'eccezione se l'ingresso non è valido.

edit: PaulPRO inviato un (ormai eliminato) risposta sottolineando che si tratta di tecnicamente possibile causare un'eccezione per essere gettato in un thread diverso, mentre tornava un valore in quella attuale. Ho pensato che fosse degno di nota, anche se non è qualcosa che dovresti vedere.

+0

Questo è quello che ho capito. Pensavo che ci potesse essere qualche trucco con un blocco finalmente però. – mark

+0

una volta che viene lanciata un'eccezione il programma si arresta, quindi è impossibile eseguire entrambe le operazioni. Mi chiedo se hai una dichiarazione di ritorno nel tuo blocco 'try', il programma passa ancora il blocco 'finale', perché se dovessi restituire un valore nel blocco try e mettere un'eccezione nel blocco Final dovresti Ho fatto entrambe le cose .. –

+2

@ Karel-Jan Misseghers: no, in Java il tuo programma ** NON DEFINITIVAMENTE ** smette di funzionare quando viene lanciata un'eccezione. Sei confuso su come funzionano le eccezioni Java e ovviamente non hai ancora fatto alcuna programmazione Java multi-thread. Puoi avere molti thread che funzionano felicemente quando un'eccezione non controllata si verifica in un altro thread. Ci sono molti casi in cui il thread di morte viene riavviato automaticamente (il più famoso è l'EDT di Swing su alcuni OS/JVM: se l'EDT muore, viene riavviato un nuovo EDT). – SyntaxT3rr0r

14

È possibile generare un'eccezione che ha una (in questo caso booleano) Valore:

public class ValueException extends Exception { 
    final boolean value; 

    public ValueException(boolean value, String message) { 
     super(message); 
     this.value = value; 
    } 

    public boolean getValue() { 
     return value; 
    } 
} 
0

Mentre è possibile scrivere il codice in modo tale che un'eccezione e un valore possono essere derivate da una chiamata a una funzione (vedi i post precedenti), non dovrebbe MAI essere fatto nella corretta codifica.

Mi piacerebbe vedere un collegamento alla documentazione su questa API. Le API dovrebbero dare priorità alla chiarezza. Lanciare un'eccezione e restituire un valore lascia la domanda se il valore che è stato restituito è sicuro da usare o se non è valido.

Ricordare che i blocchi try/catch sono l'altro metodo di gestione delle eccezioni. Non passano l'eccezione al metodo di chiamata, ma gestiscono internamente in un modo che lo sviluppatore ritenga appropriato.

Se, a scopo di debug, è necessario vedere il valore risultante in caso di eccezione, l'idea di Boemia funziona bene.

Problemi correlati