2013-07-26 12 views
16

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

+2

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

+0

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. –

+1

È possibile inserire istruzioni 'assert' nel codice – MadProgrammer

risposta

22

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 - se target o replacement è null.

Non è molto più chiaro di così!

Ecco un esempio:

enter image description here

Guardando la linea 4, vediamo foo.bar(). Ciò implica che foo è null. Quello è facile. Diamo un'occhiata a un altro esempio:

enter image description here

Tracing di nuovo al vostro codice, si vede che sta gettando s.replace(target, replacement). Dovremmo ispezionare target e replacement. Diamo allegare un debugger:

enter image description here

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

+2

Un esempio o uno screenshot con cerchi a mano libera sarebbe bello :) – hexafraction

+1

Il mio problema è che con una funzione come la funzione (a, b, c, d, e) non ti dice quale di queste variabili è nulla. –

+2

@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. –

4

ci sono alcuni modi per rendere NullPointerException meno di un problema:

  1. utilizzare il @Nullable annotation.

  2. 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.

  3. 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.

  4. Non utilizzare null nei campi per indicare lo stato. Invece, usa per es. uno enum State. Per esempio. non fare if (socket == null) { // not connected } in quanto è facile dimenticare di verificare per null in seguito. Uno stato esplicito non è così facile da dimenticare.

  5. 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 variabili final. Sostituire i metodi predefiniti printStacktrace() con throw 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.

17
  1. 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 impostare java.lang.NullPointerException. Pertanto, una volta generata l'eccezione puntatore nullo , è possibile verificare quale variabile sta causando il valore null.

  2. 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

Problemi correlati