2010-04-21 18 views

risposta

31

Quasi ogni metodo dovrebbe dichiarare il lancio.

public void myMethod(String param) throws NullPointerException { 
    // 
} 

(Come sidenote -. Eclipse per esempio, si dà un messaggio di avviso ogni volta che c'è un "potenziale accesso puntatore nullo" in modo che si può prevenire l'eccezione più presto possibile)

+0

+1 - Renderà il codice molto molto brutto. – duduamar

+8

Inoltre: catturare un 'NullPointerException' specificamente è quasi sempre una cattiva idea. –

+0

Se Java avrebbe la possibilità di dichiarare che una funzione non genera una certa eccezione, si potrebbe rendere a NullPointerException un valore predefinito per ogni funzione. Quindi si potrebbero dichiarare funzioni che non generano NullPointerException come 'public void myMethod (String param) non lancia NullPointerException' o usa'! Throws' – asmaier

11

Null eccezioni puntatore sono estensioni delle eccezioni del runtime e sono quindi imprevisti inaspettati nel flusso del programma. Non avrebbe senso aspettarsi che venga lanciata un'eccezione di puntatore nullo (spero!) E quindi non la dichiareresti mai come un'eccezione controllata.

15

Non è un'eccezione controllata (tra le altre cose) perché è estremamente comune. Può succedere praticamente ovunque. Se è stato selezionato, quindi quasi ogni singolo metodo in ogni singolo programma Java ovunque dovrebbe dichiarare che è throws NullPointerException.

3

La risposta a una frase che vorrei dare è che è il risultato di un errore di programmazione e le eccezioni degli errori di programmazione non sono eccezioni controllate (IllegalStateException, ClassCastException, ecc.).

Ma anche se si avesse una discussione sul motivo per cui dovrebbe essere un'eccezione controllata, in pratica ogni operazione su un riferimento a un oggetto può lanciarla, quindi sarebbe dappertutto e letteralmente ogni metodo in un programma non banale dovrebbe buttarlo - quindi quale sarebbe il punto?

2

La mia definizione obbligatoria per Eccezione controllata. Le eccezioni controllate sono eccezioni che un'API solleverebbe nel caso di una situazione indesiderabile nota.

NullPointerException s non indica una situazione "indesiderabile nota". Invece, quelli sono generalmente lanciati a causa di alcune situazioni non gestite nel codice. Cioè, sono il più delle volte a causa di cattive pratiche di codifica - come provare a ottenere le dimensioni di una lista che non è inizializzata correttamente ecc. Quindi, non ha senso farle controllare le eccezioni - dato che ogni oggetto in Java potrebbe essere nullo ad un certo punto?!. NullPoitnerException`s non dovrebbe mai essere catturato.

+0

Lo dovrebbe essere catturato in alto nello stack di chiamate per offrire un'esperienza utente migliore, in la mia opinione – Yaneeve

+2

Questo suona come "sconosciute conosciute" di Dick Cheney e "sconosciute sconosciute" ;-). –

+0

@yaneeve, penso che per "preso" intendessi un assegno come "if (myList! = Null)" tipo di affermazione. Oltre a questo, non ci dovrebbe essere qualcosa come 'catch (NullPointerException npe)' in un codice. Questo dovrebbe * mai * passare una revisione del codice. –

3

Eccezioni controllate possono verificarsi perché qualcosa nel ambiente, su cui il programma ha poco o nessun controllo, è andato storto (ad esempio IOException, SQLException). Puoi anticiparlo e gestirlo.

A NullPointerException (in genere) si verifica perché c'è qualche errore nel codice. Se si prevede di generare una NullPointerException, la soluzione corretta consiste nel correggere l'errore piuttosto che gestire l'eccezione.

+0

@Heinzi - Non sarei d'accordo con "si verifica perché qualcosa nell'ambiente" punto. Ad esempio, un moudle di accesso JAAS potrebbe generare 'LoginException' quando le credenziali non sono corrette. Oppure un "AccountService" potrebbe lanciare "InsufficientBalanceException" in alcuni scenari aziendali. Quindi non sono di per sé "ambientali". –

+2

Bene, uno potrebbe considerare l'input dell'utente e l'archivio dati come parte di "Ambiente", in quanto sono esterni alla logica del codice stesso. –

+0

@ring bearer, un LoginException è un problema di configurazione (ambiente) nella maggior parte dei casi (l'utente non è configurato o non configurato con tale password). Le eccezioni controllate possono essere utilizzate nel modo in cui descrivi per AccountService, ma dal momento che fa parte di un'API teorica sviluppata internamente, non penso che sia un buon esempio. – Yishai

0

Perché includerlo quando ogni funzione che scrivi dovrà dichiararlo? Solo per rendere la tua vita semplice.

1

Le eccezioni controllate sono solo per le eccezioni in cui è possibile ripristinare il programma. Il richiamo di qualcosa su un oggetto NULL è un problema dei programmatori e non può essere recuperato.

0

Se si verifica un'eccezione del puntatore Null, il proram si interromperà. Quindi è un'eccezione di controllo.

Problemi correlati