2010-11-20 13 views
12

Eventuali duplicati:
In Java, when should I create a checked exception, and when should it be a runtime exception?Uso corretto di RuntimeException?

Quando devo ricavare una deroga RuntimeException invece di Exception?

Un RuntimeException non deve essere dichiarato in throws clausola di un metodo, che può essere buona dato che non deve specificatamente elencate o cattiva perché è buona norma dichiarare esplicitamente un l'eccezione del metodo.

Pensieri?

+2

Duplicato http://stackoverflow.com/questions/499437/in-java-when-should-i-create-a-checked-exception-and-when-should-it-be-a-runtim –

risposta

43

Da Unchecked Exceptions -- The Controversy:

Se un client può ragionevolmente prevedere per recuperare da un'eccezione, fanno un'eccezione controllata. Se un client non può eseguire alcuna operazione di ripristino dall'eccezione , impostarlo come eccezione deselezionata.

noti che un'eccezione non controllato è un derivato da RuntimeException e un eccezione controllata è un derivato da Exception.

Perché inviare un RuntimeException se un client non può eseguire operazioni di ripristino dall'eccezione?L'articolo spiega:

eccezioni runtime rappresentano problemi che sono il risultato di una programmazione problema, e come tale, il codice del client API non possono ragionevolmente aspettare che recuperare da loro o per loro di gestire in qualsiasi modo. Tali problemi includono le eccezioni aritmetiche , ad esempio che si dividono per zero; puntatori alle eccezioni, , come provare ad accedere ad un oggetto attraverso un riferimento null; e indicizzazione delle eccezioni , ad esempio il tentativo di accedere a un elemento della matrice tramite un indice troppo grande o troppo piccolo.

8

Ci sono molti scenari in sviluppo di applicazioni enterprise in cui si usa RuntimeException invece di eccezione, in seguito sono due scenari che sono abbastanza comuni:

  • Mentre attuazione gestione delle eccezioni come un aspetto (che separa la principale preoccupazione di progettazione), nella maggior parte dei framework di oggi si dichiarano le eccezioni di handle e si associano specifici blocchi di gestione delle eccezioni piuttosto che gli stessi hardcoding. Un buon esempio di questo è il modello JDBC in Spring che converte tutte le eccezioni SQL in RuntimeException in modo che lo sviluppatore non scriva try catch blocks durante la scrittura della logica di accesso ai dati. è possibile definire in modo dichiarativo il gestore di eccezioni che può fornire un comportamento diverso in dev env. e diversi comportamenti nella produzione. Implementazione simile è presente anche nella classe Action di Struts 1.x, in cui il metodo execute viene dichiarato per generare Exception e c'è un ExceptionHandler separato mappato in struts-config per la gestione di eccezioni specifiche. Anche se questo non è un esempio di RuntimeException, ma il principio di progettazione è lo stesso per separare la preoccupazione della normale esecuzione e della gestione delle eccezioni.
  • Un altro uso di RuntimeException è in EJB e in altri Gestori transazioni in cui nelle transazioni sono controllati per container. In tali contenitori per convenzione se si lancia RuntimeException dal codice della transazione avrebbe rollback - lo stesso non sarebbe accaduto se si getta Eccezione

Questi sono 2 scenari che vengono subito in mente ci sarebbero altri scenari di- corso.