Sto usando eclipse e la programmazione in java. A volte mi imbatto in una nullPointerException che mi affliggerà per ore. Esiste comunque la possibilità di eseguire il debug di nullPointerExceptions e di capire quali sono i valori delle variabili e altre cose che potrebbero causare eccezioni Pointer nulle.Un buon modo per eseguire il debug di nullPointerException
risposta
Esaminare la traccia dello stack e leggere il numero di riga in cui viene lanciato lo NullPointerException
. Quasi sempre, la linea ha una certa chiamata di metodo come
x.getValue()
Se x
è null
, si ottiene un NullPointerException
. Se il metodo nella parte superiore della traccia dello stack non è il tuo codice, traccia lo stack fino a raggiungere il tuo codice. Molto spesso, in questo caso, stai passando a null
un metodo a cui non piacciono i parametri null
. Trovalo e risolvilo.
Inoltre, molto spesso quando si incontra un metodo che non è il tuo che sta lanciando un NullPointerException
, leggere la documentazione. Ad esempio, guardate String.replace(CharSequence target, CharSequence replacement)
:
Lanci:
NullPointerException
- setarget
oreplacement
ènull
.
Non è molto più chiaro di così!
Ecco un esempio:
Guardando la linea 4, vediamo foo.bar()
. Ciò implica che foo
è null
. Quello è facile. Diamo un'occhiata a un altro esempio:
Tracing di nuovo al vostro codice, si vede che sta gettando s.replace(target, replacement)
. Dovremmo ispezionare target
e replacement
. Diamo allegare un debugger:
Aha! replacement
è null
. Puoi fare la stessa cosa in Eclipse. Imposta un punto di interruzione per quando viene generata un'eccezione e usala per ispezionare i parametri del tuo metodo. Sono primitivo qui perché vengo da una scuola di pensiero in cui credo sinceramente che tutti starebbero meglio se avessero imparato a farlo prima nel modo più duro. Astrazioni che perdono e tutto il resto
Un esempio o uno screenshot con cerchi a mano libera sarebbe bello :) – hexafraction
Il mio problema è che con una funzione come la funzione (a, b, c, d, e) non ti dice quale di queste variabili è nulla. –
@hexafraction: o meglio ancora, 8x10 in immagini lucide con cerchi e frecce e un paragrafo sul retro di ciascuna di esse che spiega che cosa devono essere utilizzate ciascuna. –
ci sono alcuni modi per rendere NullPointerException
meno di un problema:
utilizzare il @Nullable annotation.
Verificare i valori degli argomenti per
null
in costruttori e setter (evitare setter in semplice codice Java vecchio). Se lo fai molto potresti creare un modello di codice sorgente (Eclipse) per generare rapidamente il codice.Questo è chiamato "failfast" - non si aspetta che l'eccezione venga generata quando il valore viene utilizzato ulteriormente nel codice, ad es. dopo averlo memorizzato in un campo.Assicurarsi di eseguire una quantità minima (ad esempio 1 o 2) di operazioni per linea. Se non lo fai dovrai scoprire dove nell'espressione a linea singola si è verificato lo
NullPointerException
.Non utilizzare
null
nei campi per indicare lo stato. Invece, usa per es. unoenum State
. Per esempio. non fareif (socket == null) { // not connected }
in quanto è facile dimenticare di verificare pernull
in seguito. Uno stato esplicito non è così facile da dimenticare.Non inizializzare le variabili locali su
null
se non esplicitamente necessario. In realtà, se gestisci correttamente l'ambito e le eccezioni, dovresti essere in grado di contrassegnare la maggior parte delle variabilifinal
. Sostituire i metodi predefinitiprintStacktrace()
conthrow new IllegalStateException("Unhandled program state", e)
aiuta perché è visto come un punto di uscita di un blocco di codice.
Dopo molte programmazioni, il numero di NullPointerException
s scende.
Durante il debug si può utilizzare la vista
BreakPoints
, per catturare i nulli puntatori.Finestra -> Visualizza Visualizza -> Breakpoint
Dal punto di vista c'è una
"J!"
che permette di impostare i punti di interruzione sul eccezioni. È possibile impostarejava.lang.NullPointerException
. Pertanto, una volta generata l'eccezione puntatore nullo , è possibile verificare quale variabile sta causando il valore null.Un'altra cosa che puoi fare è catturare l'accesso al puntatore nullo durante la codifica. Fuori portata non puoi catturare tutti i Puntatori Nulli usando questa impostazione. Ma è comunque utile, imposta le seguenti impostazioni in eclissi.
Preferenze -> Java -> Compiler -> errori/avvisi -> analisi Null
cerca nella traccia dello stack ... si vede quale linea ha gettato la NPE e si può mettere un punto di rottura lì e vedere quale variabile è nullo ... – chancea
Il modo migliore per imparare a eseguire il debug di NPE è quello di continuare a eseguirne il debug. Otterrai risultati migliori con il tempo. Ma la chiave è scoprire dove si sta verificando e quindi controllare le variabili. Nessuna magia qui. –
È possibile inserire istruzioni 'assert' nel codice – MadProgrammer