2009-07-01 14 views
46

Come posso creare un nuovo Exception diverso dai tipi già creati?Come posso scrivere eccezioni personalizzate?

public class InvalidBankFeeAmountException extends Exception{ 
    public InvalidBankFeeAmountException(String message){ 
     super(message); 
    } 
} 

Si mostrerà l'avvertimento per la InvalidBankFeeAmountException che è scritto nella prima riga.

+0

Ho creato una mia eccezione che è mostrata sopra.crea una classe con il nome di quell'eccezione speciale ed estende Exception. MA ha un avviso che è: La classe serializzabile Eccezione non dichiara un campo seriale serialVersionUID finale statico. Come posso risolverlo ????? – Johanna

+1

Non devi preoccuparti di questo avviso se non vuoi. Poiché la classe Exception è serializzabile, è necessario impostare un ID seriale per la classe. Ma, dato che è solo un avvertimento, di solito lo ignoro. – jjnguy

+0

ma quando uso questa classe come tipo nel metodo main() verrà mostrato l'altro avviso che: Impossibile lanciare il tipo InvalidBankFeeAmountException. – Johanna

risposta

103

Tutto ciò che dovete fare è creare un nuovo class e averlo extend Exception.

Se si desidera un Exception deselezionato, è necessario extend RuntimeException.

Nota: Una controllato Exception è uno che richiede di uno circondare la Exception in un blocco try/catch o di avere un 'throws' clausola relativa alla dichiarazione di metodo. (come IOException) Deselezionato Exceptions può essere lanciato come controllato Exceptions, ma non è necessario gestirli esplicitamente in alcun modo (IndexOutOfBoundsException).

Ad esempio:

public class MyNewException extends RuntimeException { 

    public MyNewException(){ 
     super(); 
    } 

    public MyNewException(String message){ 
     super(message); 
    } 
} 
+37

Nota: se si utilizza Eclipse, è sufficiente scrivere 'throw new Exception', quindi utilizzare Autofix (Ctrl + 1). Questo creerà una nuova classe per te che estende Exception e contiene il codice boilerplate. –

+4

Ho sentito che può essere una cattiva pratica estendere [RuntimeExceptions] (http://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html): * Se ci si può ragionevolmente aspettare che un client recuperi da un'eccezione, rendila un'eccezione controllata. Se un client non può fare nulla per recuperare dall'eccezione, rendilo un'eccezione non controllata. * – Pureferret

+0

Ho appena letto il resto della risposta, hai capito, ho solo bisogno di leggere più del codice prima di commentare. – Pureferret

31

solo estendono sia

  • Exception, se volete che il vostro eccezioni da controllare (ad esempio: richiesta in una clausola throws)
  • RuntimeException, se si desidera la tua eccezione deve essere deselezionata.
3

Date un'occhiata a:

http://www.onjava.com/pub/a/onjava/2003/11/19/exceptions.html?page=1

Un esempio è dato lì a pagina 2:

public class DuplicateUsernameException 
    extends Exception { 
    public DuplicateUsernameException 
     (String username){....} 
    public String requestedUsername(){...} 
    public String[] availableNames(){...} 
} 

insieme a una serie di linee guida per quando e perché devi creare le tue eccezioni.

3

Assicurarsi di non esagerare con le eccezioni, in particolare le eccezioni controllate. Consiglierei di leggere il Capitolo 9 di Joshua Bloch's Effective Java, e in particolare il suo Articolo 60 (Favorire l'uso delle eccezioni standard). I suoi consigli includono anche l'utilizzo di eccezioni controllate per le eccezioni da cui è possibile recuperare, utilizzando eccezioni non controllate (RuntimeExceptions) per errori di programmazione ed evitando l'uso non necessario delle eccezioni controllate.

Se viene generata un'eccezione InvalidBankAccount ogni volta che viene rilevato un errore di programmazione, è probabile che si desideri semplicemente lanciare UnlegalStateException Java non controllato standard. (Ciò distoglie nettamente la necessità di dichiarare serialVersionUID.)

Problemi correlati