Frage

Ich dachte, Java Kurzschlussauswertung hatte, doch ist diese Linie immer noch eine Null-Zeiger-Ausnahme wirft:

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 Anwendung abstürzt noch auf dieser Linie mit einer Nullpointer.

EDIT, allgemeine Antwort:

Da perfectAgent null ist, nichts rechts von der && ausgeführt werden sollte, da es unmöglich ist, den Ausdruck wahr zu sein. Mehr zu dem Punkt, ist es unmöglich, perfectAgent.getAddress() auszuführen, da perfectAgent keine gültige Referenz enthält (es null und alle zu sein). Ich versuche, Kurzschlussauswertung verwenden nicht für null in einer separaten Erklärung zu prüfen zu haben, wie, dass die Logik mehr schlampig macht.

EDIT 2 (oder, ich bin ein Idiot): Ja, wie viele Dinge im Leben du darauf die Antwort heraus direkt nach der Welt verkünden, dass Sie ein Idiot sind. In diesem Fall hatte ich ausgeschaltet Autobuild Eclipse, während etwas anderes und nicht wieder eingeschaltet zu tun, so wurde das Debuggen mir Klassendateien, die nicht mit meiner Quelle übereinstimmen haben.

War es hilfreich?

Lösung

Erweiterte Debug-Lektion # 1:

Wenn Sie in eine scheinbar unmögliche Fehler führen (zum Beispiel ein, dass Sie das Wissen über Java widerspricht), gehen Sie wie folgt vor:

  • Konsultieren Sie einen seriösen Textbuch (oder besser noch, die entsprechende Norm), um zu bestätigen, dass Ihr Verständnis nicht fehlerhaft ist. (In diesem Fall Ihres Verständnis war richtig, und jedes halbwegs anständiges Lehrbuch würde dies in einer Minute bestätigen.)

  • all die dummen Dinge überprüfen, ob Sie das getan haben könnte könnte das Unmögliche Fehler verursachen. Dinge wie eine Datei, nicht zu tun, einen vollständigen Build zu speichern, eine alte / veraltete Version der Anwendung ausgeführt wird, in dem falschen Verzeichnis zu sein, und so weiter.

Insgesamt lernen, sich immer ein bisschen zu zweifeln.

Andere Tipps

Wenn perfectAgent wirklich null ist, dass Code nicht eine Ausnahme aus (zumindest vorausgesetzt, es ist nicht seltsam Threading Dinge gehen, sie von Nicht-Null-Wechsel auf halben Weg auf null durch die Ausdruck). Ich würde völlig schockiert sein, wenn Sie ein kurzes, aber vollständige Programm produzieren könnten es damit zu demonstrieren.

Also ja, Ihre Intuition ist richtig - das ist kein Problem sein sollte. Schauen Sie sich woanders für die Ursache. Ich stark, dass perfectAgent vermutet nicht tatsächlich null, und dass Sie in diesem Code in eine der anderen Situationen ausführen, die eine Ausnahme verursachen könnte.

Ich schlage vor, Sie versuchen, dieses Stück Code zu extrahieren in ein kurzes, aber vollständige Beispiel - wenn Sie dies tun, werde ich meinen metaphorischen Hut essen; wenn nicht, werden Sie hoffentlich das Problem finden, während Sie die Extraktion versuchen.

Was macht Sie denken, dass perfectAgent wirklich null? Experimentieren Sie diesen Code, bevor es:

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.

Java hat haben Kurzschlussauswertung. Vielleicht ist entry null und so verursacht entry.getKey() die NullPointerException. Eine weitere Möglichkeit besteht darin, dass getAddress() entweder zurück null oder ein NullPointerException innen irgendwo passiert (wenn es komplizierter als eine einfache return Anweisung).

EDIT: Ich sehe Ihre bearbeiten, wo Sie diese behaupten:

  

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

Was aber, wenn perfectAgent.getAddress() ist erfolgreich ausgeführt und Rückgabe null? Sehen Sie, was ich meine ...

Sie sorgen dafür, dass perfectAgent nicht null ist, so ein oder mehr perfectAgent.getAddress() oder entry oder entry.getKey() muss null sein. Oder getAddress () oder getKey () schlagen eine NPE in deren Umsetzung.

Um diese Art der Sache zu debuggen, zunächst einen Blick auf dem Stack-Trace, um die Position zu festzunageln. Dies würde Ihnen sagen, wenn es in getAddress () oder in getKey () oder in dem eingefügten Code-Schnipsel geschieht, die sie nennt. wenn es in diesem Snippet ist, fügen Sie nächsten einig Code vor dem if zu testen, welcher null ist. Sie können gute alte System.err.println () oder Behauptungen . (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 (es ein NPE auf dieser Linie war und doch ist der Kurzschluss passiert sein sollte) und ich automatisch angenommen die erste Tatsache wahr und die zweite falsch war, wenn in der Tat ist es das auto-Build in Eclipse ausschalten ein anderes Problem vollständig zurückzuführen war. Duh! In Debuggen etwas „unmöglich“ es hilft radikal skeptisch sein.

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

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

die Anweisung Break up oder in einem Debugger ausführen.

Big Mistery. Ich kopierte Ihre Codezeile und getestet mit perfectAgent == null, entry == null, entry.getKey() == null und Kombinationen die: Nein NPE in meinem Testbett (Java 1.6).

Was auch immer ärgerlicher Fehler es ist, bezweifle ich, dass es etwas mit Kurzschluss-Auswertung zu tun hat. Wenn es diese Zeile verursacht NPE, als, soweit ich sagen kann, ist perfectAgent nicht null. Viel Glück und - zeigen Sie uns den Fehler, sobald Sie es gefangen haben:)

Versuchen Sie Ihren Code wie folgt Formatierung:

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

Es sollte Ihnen eine bessere Stack-Trace Zeileneingabe.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top