Questa è stata la domanda posta in un'intervista. NullPointerException
è molto comune; perché non è dichiarato come un'eccezione controllata? Ho cercato su Google ma non ho ricevuto una risposta adeguata.Perché NullPointerException non è dichiarato come eccezione verificata
risposta
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)
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.
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
.
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?
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.
Lo dovrebbe essere catturato in alto nello stack di chiamate per offrire un'esperienza utente migliore, in la mia opinione – Yaneeve
Questo suona come "sconosciute conosciute" di Dick Cheney e "sconosciute sconosciute" ;-). –
@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. –
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.
@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". –
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. –
@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
Perché includerlo quando ogni funzione che scrivi dovrà dichiararlo? Solo per rendere la tua vita semplice.
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.
Se si verifica un'eccezione del puntatore Null, il proram si interromperà. Quindi è un'eccezione di controllo.
- 1. Perché NULL non è dichiarato?
- 2. Perché std :: map find() non è dichiarato come noexcept?
- 3. "identificatore non dichiarato" è in realtà dichiarato
- 4. Perché System.out.println() non lancia NullPointerException?
- 5. Perché System.in è dichiarato nullInputStream() anziché null?
- 6. Perché questo non causa una NullPointerException?
- 7. C#: come faccio a verificare "nessuna eccezione si è verificata" nel mio test unitario?
- 8. Perché jQuery.css non applica una proprietà se non è supportata e in che modo viene verificata?
- 9. Si è verificata un'eccezione non gestita di tipo "System.StackOverflowException"
- 10. Perché Task.WaitAny non fa eccezione?
- 11. Lisp: CHAR non è dichiarato né vincolato
- 12. "Si è verificata un'eccezione durante l'elaborazione della richiesta. Inoltre, si è verificata un'altra eccezione durante l'esecuzione della pagina di errore personalizzata ..."
- 13. errore: 'std :: this_thread' non è stato dichiarato
- 14. sockaddr_in identificatore non dichiarato
- 15. Perché questo evento è stato dichiarato con un delegato anonimo?
- 16. Perché il tipo di reso non è stato dichiarato come struct in .NET?
- 17. Perché sbt lancia "eccezione enablePlugins non è membro dell'eccezione sbt.Project"?
- 18. Perché è necessario rilevare "Eccezione" ma non la Sottoclasse "RuntimeException"?
- 19. 'RTLD_NEXT' non dichiarato
- 20. "Eccezione chiamata" DownloadFile "con argomento" 2 ":" Si è verificata un'eccezione durante una richiesta di WebClient. "
- 21. Si è verificata una prima eccezione di tipo "System.InvalidCastException" in WindowsBase.dll
- 22. Perché NullPointerException è un'eccezione di runtime e RemoteException no?
- 23. Delphi - identificatore non dichiarato: LOCALE_SYSTEM_DEFAULT
- 24. Sistema non dichiarato nell'ambito?
- 25. JSP non buttare NullPointerException
- 26. Perché sto ricevendo "Uso dell'identificatore non dichiarato 'malloc'"?
- 27. JSLint - Avviso 'jQuery' non dichiarato
- 28. M_PI contrassegnato come identificatore non dichiarato
- 29. Perché questa eccezione non viene rilevata?
- 30. comando non è definito eccezione
+1 - Renderà il codice molto molto brutto. – duduamar
Inoltre: catturare un 'NullPointerException' specificamente è quasi sempre una cattiva idea. –
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