2009-11-29 14 views
15

ho pensato Java avuto la valutazione di corto circuito, ma questa linea è ancora lanciando un'eccezione di puntatore nullo:Java corto circuito di valutazione

if((perfectAgent != null) && (perfectAgent.getAddress().equals(entry.getKey()))) { 

In questo caso perfectAgent è null, quindi voglio solo l'intera espressione per tornare false , ma la mia app si arresta ancora su questa linea con una NullPointerException.

EDIT, risposta generale:

Dal perfectAgent è null, nulla alla destra del && dovrebbe essere eseguito, come è impossibile per l'espressione per essere vero. Più precisamente, è impossibile eseguire perfectAgent.getAddress() poiché perfectAgent non contiene un riferimento valido (essendo null e tutto). Sto tentando di utilizzare la valutazione di cortocircuito per non dover controllare null in un'istruzione separata in quanto ciò rende la logica più sciatta.

EDIT 2 (o, sono un idiota): Sì, come molte cose nella vita, si capisce la risposta subito dopo aver annunciato al mondo che sei un deficiente. In questo caso, ho disattivato l'autobuild di Eclipse mentre facevo qualcos'altro e non lo ho riattivato, quindi stavo eseguendo il debug dei file di classe che non corrispondevano alla mia fonte.

+6

Avete controllato che la voce non sia nulla? –

+0

L'inserimento non è nullo. – Donnie

+1

Se 'perfectAgent' è' null' allora il resto di quella riga non dovrebbe essere eseguito. Non vedo alcun problema con esso com'è ora:/ – Joey

risposta

4

avanzata lezione debug # 1:

Se si esegue in un errore di apparentemente impossibile (ad esempio uno che contraddice voi conoscenza di Java), effettuare le seguenti operazioni:

  • Consultare un testo stimabile prenota (o meglio ancora, lo standard pertinente) per confermare che la tua comprensione non è imperfetta. (In questo caso la tua comprensione era corretta, e qualsiasi testo decente lo confermerebbe in un minuto.)

  • Controllare tutte le cose stupide che avresti potuto fare che potrebbero causare l'errore impossibile.Cose come non salvare un file, non fare una compilazione completa, eseguire una versione vecchia/obsoleta dell'applicazione, trovarsi nella directory sbagliata e così via.

In breve, impara a dubitare un po 'di più.

2

Assicurati che perfectAgent non sia nullo, quindi uno o più di perfectAgent.getAddress() o entry o entry.getKey() devono essere nulli. O getAddress() o getKey() stanno colpendo un NPE nella loro implementazione.

Per eseguire il debug di questo tipo di cose, esaminare prima la traccia dello stack per individuare la posizione. Questo ti direbbe se succede in getAddress() o in getKey() o nello snippet di codice incollato che li chiama. Successivamente, se è in questo frammento, aggiungi del codice prima del se per testare quale è nullo. È possibile utilizzare il buon vecchio System.err.println() o assertions. (Se si utilizza affermazioni, assicurarsi di consentire loro con -enableassertions la bandiera del comando java.)

Aggiornamento: Quindi la mia interpretazione si è rivelata sbagliata ... il problema ha presentato due fatti contraddittori (c'era un NPE su questa linea e tuttavia il cortocircuito avrebbe dovuto accadere) e ho assunto automaticamente che il primo fatto fosse vero e il secondo falso quando in realtà si trattava di un problema diverso interamente dovuto alla disattivazione dell'auto-build in Eclipse. Duh! Nel debug di qualcosa "impossibile" aiuta ad essere radicalmente scettico.

7

Java fa hanno valutazione di cortocircuito. Forse entry è null e quindi entry.getKey() sta causando il NullPointerException. Un'altra possibilità è che getAddress() restituisca null o che un NullPointerException si verifichi da qualche parte (se è più complicato di una semplice istruzione return).

EDIT: vedo la tua modifica in cui si sostiene questo:

Più precisamente, è impossibile eseguire perfectAgent.getAddress() ...

Ma cosa succede se viene eseguito con successoperfectAgent.getAddress()e restituiscenull? Capito quello che intendo...

0

ci sono tre riferimenti diversi da perfectAgent che potrebbe essere nullo:

  • perfectAgent.getAddress()
  • ingresso
  • entry.getKey()

suddividere l'istruzione o eseguilo in un debugger.

+0

'entry.getKey()' essendo null non risulterebbe in un 'NullPointerException' nel frammento di codice dell'OP. – Asaph

+0

Object.equals (null) restituisce false sempre. Quindi non sarebbe entry.getKey() restituendo null. Quindi deve essere uno dei primi due elencati. –

+0

Ah sì, siete entrambi corretti. Solo i primi due sono candidati. –

10

Se perfectAgent prettamente nullo, tale codice non sarà gettare un'eccezione (almeno assumendo non ci sono strani cose filettatura corso, trasformandolo da non null null metà strada attraverso l'espressione). Sarei completamente scioccato se potessi produrre un programma breve ma completo che lo dimostri.

Quindi sì, il tuo intuito è giusto - questo non dovrebbe essere un problema. Cerca altrove la causa. Sospetto fortemente che perfectAgentnon sia effettivamente nullo e che tu stia correndo in una qualsiasi delle altre situazioni in quel codice che potrebbe causare un'eccezione.

Vi suggerisco di provare ad estrarre quel bit di codice in un breve ma completo esempio: se potete farlo, mangerò il mio cappello metaforico; in caso contrario, si spera di trovare il problema mentre si tenta l'estrazione.

Cosa ti fa pensare che perfectAgent veramente è null? Provare a inserire questo codice prima che:

if (perfectAgent == null) 
{ 
    System.out.println("Yup, it's null"); 
} 

Un'altra possibilità molto, molto sottile è che hai incontrato un bug JIT - ma ne dubito fortemente.

+0

Oh, sì, non pensavo che fosse un bug del JIT, stavo solo cercando di capire cosa ho sbagliato. – Donnie

+0

Non hai fatto nulla di sbagliato nel codice che hai mostrato - almeno nulla che possa causare questo. Sospetto che sia qualcosa in qualunque cosa ti porti a credere che perfectAgent sia nullo :) –

+0

Vedi il mio Edit2. Proprio sul naso. – Donnie

1

Grande mistero. Ho copiato la tua linea di codice e testato con perfectAgent == null, entry == null, entry.getKey() == null e combinazioni di quelli: Nessun NPE nel mio banco di prova (Java 1.6).

Qualunque sia fastidioso bug, dubito che abbia qualcosa a che fare con la valutazione del cortocircuito. Se è questa linea che causa NPE, allora, per quanto posso dire, perfectAgent non è nullo. Buona fortuna e - ci mostrano il bug una volta che hai catturato it :)

0

provare a formattare il codice in questo modo:

if( 
    (perfectAgent != null) 
    && (
     perfectAgent.getAddress() 
     .equals(
     entry.getKey() 
    ) 
    ) 
) { 

dovrebbe dare una voce migliore linea di traccia dello stack.