2009-11-29 11 views
15

Ich dachte, Java Kurzschlussauswertung hatte, doch ist diese Linie noch einen Null-Zeiger Ausnahme werfen:Java Kurzschlussauswertung

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

In diesem Fall perfectAgent ist null, so möchte ich nur der gesamte Ausdruck false zurückzukehren , aber meine App stürzt immer noch mit einer NullPointerException in dieser Zeile ab.

EDIT, allgemeine Antwort:

Da perfectAgent ist null, nichts rechts von der && ausgeführt werden soll, wie es für den Ausdruck wahr zu sein ist unmöglich. Genauer gesagt ist es unmöglich, perfectAgent.getAddress() auszuführen, da perfectAgent keine gültige Referenz enthält (es ist null und alle). Ich versuche, die Kurzschlussauswertung zu verwenden, um in einer separaten Anweisung nicht nach Null zu suchen, da dies die Logik schlampiger macht.

EDIT 2 (oder, ich bin ein Idiot): Ja, wie viele Dinge im Leben finden Sie die Antwort direkt nach der Ankündigung an die Welt, dass Sie ein Trottel sind. In diesem Fall hatte ich Eclipse's Autobuild ausgeschaltet, während ich etwas anderes machte und es nicht wieder anschaltete, also debuggte ich mit Klassendateien, die nicht mit meiner Quelle übereinstimmten.

+6

Haben Sie überprüft, dass der Eintrag nicht null ist? –

+0

Der Eintrag ist nicht null. – Donnie

+1

Wenn 'perfectAgent'' null' ist, sollte der Rest dieser Zeile nicht ausgeführt werden. Kein Problem damit, wie es jetzt ist:/ – Joey

Antwort

4

Erweitern Debug-Lektion # 1:

Wenn Sie in einen scheinbar unmöglichen Fehler ausgeführt (zB eine, die Sie Wissen über Java widerspricht), gehen Sie wie folgt vor:

  • einen seriösen Text Consult Buch (oder noch besser, der relevante Standard) zu bestätigen, dass Ihr Verständnis nicht fehlerhaft ist. (In diesem Fall war Ihr Verständnis korrekt, und jedes halbwegs anständige Lehrbuch würde dies in einer Minute bestätigen.)

  • Überprüfen Sie alle dummen Dinge, die Sie hätten tun können, die den unmöglichen Fehler verursachen könnten.Dinge wie das Speichern einer Datei, das Erstellen eines vollständigen Builds, das Ausführen einer alten/veralteten Version der Anwendung, das falsche Verzeichnis und so weiter.

Zusammenfassend lernen Sie, sich ein bisschen mehr zu bezweifeln.

2

Sie stellen sicher, dass perfectAgent nicht null ist, daher muss mindestens einer von perfectAgent.getAddress() oder entry oder entry.getKey() null sein. Oder getAddress() oder getKey() treffen eine NPE in ihrer Implementierung.

Um solche Dinge zu debuggen, schauen Sie sich zuerst den Stack-Trace an, um den Speicherort festzulegen. Dies würde Ihnen sagen, ob es in getAddress() oder in getKey() oder in dem eingefügten Code-Snippet geschieht, das sie aufruft. Als nächstes, wenn es in diesem Snippet ist, fügen Sie etwas Code vor dem if hinzu, um zu testen, welches null ist. Sie können eine gute alte System.err.println() oder assertions verwenden. (Wenn Sie Behauptungen verwenden, müssen Sie sie mit der -enableassertions Flagge java Befehl aktivieren.)

Update: So wandte meine Interpretation falsch heraus ... das Problem präsentiert zwei widersprüchliche Fakten (gab es eine NPE in dieser Zeile und doch sollte der Kurzschluss passiert sein) und ich nahm automatisch an, dass die erste Tatsache wahr und die zweite falsch war, obwohl es in Wirklichkeit ein anderes Problem war, weil der Auto-Build in Eclipse ausgeschaltet war. Duh! Beim Debuggen von etwas "Unmöglichem" hilft es, radikal skeptisch zu sein.

7

Java hat Kurzschlussauswertung. Vielleicht entry ist null und so entry.getKey() verursacht die NullPointerException. Eine andere Möglichkeit ist, dass getAddress() entweder null zurückgibt oder eine NullPointerException irgendwo innerhalb passiert (wenn es komplizierter ist als eine einfache return Anweisung). erfolgreich ausgeführt

Mehr zu dem Punkt, ist es unmöglich, perfectAgent.getAddress() auszuführen ...

Aber was, wenn perfectAgent.getAddress()ist:

EDIT: Ich sehe Ihre bearbeiten, wo Sie diese Behauptung und gibtnull zurück? Verstehst du, was ich meine...

0

Es gibt drei Referenzen andere als perfectAgent, die null sein könnte:

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

Break up die Aussage oder Führen Sie es in einem Debugger aus.

+0

'entry.getKey()' 'NULL würde zu keiner' NullPointerException' im OP-Code-Snippet führen. – Asaph

+0

Object.equals (null) gibt immer false zurück. Es wäre also nicht entry.getKey(), das null zurückgibt. Also muss es einer der ersten beiden sein. –

+0

Ah ja, Sie sind beide richtig. Nur die ersten beiden sind Kandidaten. –

10

Wenn perfectAgent wirklich null ist, wird dieser Code nicht eine Ausnahme aus (zumindest dort unter der Annahme ist nicht seltsam Threading Dinge gehen, sie von Nicht-Null-Wechsel auf halben Weg durch den Ausdruck auf null). Ich wäre sehr schockiert, wenn Sie ein kurzes, aber vollständiges Programm erstellen könnten, um dies zu demonstrieren.

Also ja, Ihre Intuition ist richtig - das sollte kein Problem sein. Suchen Sie anderswo nach der Ursache. Ich vermute stark, dass perfectAgentnicht ist eigentlich Null, und dass Sie in einer der anderen Situationen in diesem Code, die eine Ausnahme verursachen könnte laufen.

Ich schlage vor, Sie versuchen, diesen Code in einem kurzen, aber vollständigen Beispiel zu extrahieren - wenn Sie dies tun können, werde ich meinen metaphorischen Hut essen; Wenn nicht, werden Sie hoffentlich das Problem finden, während Sie die Extraktion versuchen.

Was lässt Sie denken, dass perfectAgent wirklich ist null? Versuchen Sie diesen Code vor dem Einsetzen:

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

Eine weitere sehr, sehr schlanke Möglichkeit ist, dass Sie in einen JIT-Fehler ausgeführt haben - aber ich bezweifle es.

+0

Oh, ja, ich dachte nicht, dass es ein JIT-Bug war, ich wollte nur herausfinden, was ich falsch gemacht habe. – Donnie

+0

Sie haben in dem Code, den Sie angezeigt haben, nichts falsch gemacht - zumindest nichts, was dies verursachen würde. Ich vermute, dass es etwas ist, was dich dazu bringt zu glauben, dass perfectAgent null ist :) –

+0

Siehe meine Edit2. Direkt auf der Nase. – Donnie

1

Große Geheimnis. Ich kopierte Ihre Codezeile und testete mit perfectAgent == null, entry == null, entry.getKey() == null und Kombinationen davon: Kein NPE in meinem Testbett (Java 1.6).

Was auch immer nerviger Bug ist, ich bezweifle, dass es etwas mit Kurzschlussauswertung zu tun hat. Wenn es diese Linie ist, die NPE verursacht, dann ist, soweit ich sagen kann, perfectAgent nicht null. Viel Glück und - zeigen Sie uns den Fehler, sobald Sie es gefangen haben :)

0

Versuchen Formatierung Code wie folgt:

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

Es sollte Ihnen eine bessere Stack-Trace Zeileneintrag.