Frage

Wenn ich eine Nullpointer in einem Aufruf wie folgt erhalten:

someObject.getSomething().getSomethingElse().
    getAnotherThing().getYetAnotherObject().getValue();

Ich erhalte einen ziemlich nutzlos Ausnahmetext wie:

Exception in thread "main" java.lang.NullPointerException
at package.SomeClass.someMethod(SomeClass.java:12)

Ich finde es ziemlich hart wich Anruf, um herauszufinden, null tatsächlich returend, oft selbst zu finden, den Code Refactoring zu so etwas wie folgt aus:

Foo ret1 = someObject.getSomething();
Bar ret2 = ret1.getSomethingElse();
Baz ret3 = ret2.getAnotherThing();
Bam ret4 = ret3.getYetAnotherOject();
int ret5 = ret4.getValue();

und dann für einen aussagekräftigeren Nullpointer warten, das mir sagt, welche Zeile zu suchen.

Einige von euch könnte argumentieren, dass concatening Getter schlechter Stil ist und sollte auf jeden Fall vermieden werden, aber meine Frage ist: Kann ich den Fehler finden, ohne den Code zu ändern?

. Hinweis: Ich bin mit Eclipse und ich weiß, was ein Debugger ist, aber ich kann nicht Figuere, wie es für das Problem anwenden

Meine Schlussfolgerung auf die Antworten:
Einige Antworten hat mir gesagt, dass ich nicht Kette Getter einer nach dem anderen, einige Antworten zeigte meine, wie mein Code debuggen, wenn ich diesen Rat disobayed.

Ich habe eine Antwort akzeptiert, die mich excactly lehrte, als Ketten Getter:

  • Wenn sie nicht null zurückkehren können, ketten sie so lange wie Sie möchten. Keine Notwendigkeit für die Überprüfung! = Null, keine Notwendigkeit, über Nullpointerexceptions zu kümmern ( wird davor gewarnt, dass noch Verkettungs das Gesetz der demeter vialotes, aber ich kann damit leben )
  • Wenn sie kann null zurück, nicht immer, Kette nie sie, und einen Scheck für Nullwerte auf jedem durchführen, die null
  • zurückkehren

Das macht jede gute Ratschläge auf den tatsächlichen Debuggen nutzlos.

War es hilfreich?

Lösung

Die Antwort hängt davon ab, wie Sie (den Vertrag) Ihre Getter anzuzeigen. Wenn sie zurückkehren, null Sie wirklich den Rückgabewert jedes Mal überprüfen sollen. Wenn der Getter nicht null zurückkehren sollte, sollte der Getter einen Scheck enthalten und eine Ausnahme (IllegalStateException?) Zu werfen, anstatt null zurückzukehren, dass Sie nie wieder zurückzukehren versprochen. Die Stacktrace werden Sie auf die genau Getter zeigen. Man könnte sogar die unerwarteten Zustand Ihrer Getter in der Ausnahmemeldung gefunden setzen.

Andere Tipps

NPE ist die nutzlos Ausnahme in Java, Zeitraum. Es scheint immer träge umgesetzt werden und nie genau sagt, was sie verursacht hat, auch so einfach wie „Klasse x.y.Z ist null“ würde in einem solchen Fall das Debuggen viel helfen.

Wie auch immer, die einzige gute Möglichkeit, die ich gefunden habe, die NPE Werfer in diesen Fällen zu finden, ist die folgende Art von Refactoring:

someObject.getSomething()
          .getSomethingElse()
          .getAnotherThing()
          .getYetAnotherObject()
          .getValue();

Da haben Sie es, jetzt NPE Punkte Linie zu korrigieren und damit richtige Methode, die die eigentliche NPE warf. Nicht so elegante Lösung als würde ich will, dass es sein, aber es funktioniert.

In IntelliJ IDEA können Sie exceptionbreakpoints . Diese Stützpunkte abzufeuern, wenn eine festgelegte Ausnahme ausgelöst wird (man kann diesen Bereich zu einem Paket oder eine Klasse).

Auf diese Weise es leicht sein, sollte die Quelle Ihrer NPE zu finden.

Ich würde davon ausgehen, dass Sie etwas ähnliches in Netbeans oder Eclipse tun können.

EDIT: Hier ist eine Erklärung, wie eine exceptionbreakpoint in eclipse hinzufügen

Wenn Sie sich oft zu schreiben:

a.getB().getC().getD().getE();

Dies ist wahrscheinlich ein Code Geruch und sollte vermieden werden. Sie können zum Beispiel in a.getE() Refactoring die b.getE() nennt die c.getE() die d.getE() nennt nennt. (Dieses Beispiel kann nicht sinnvoll für Ihren speziellen Anwendungsfall machen, aber es ist ein Muster dieses Code Geruch für die Befestigung.)

Siehe auch die Gesetz von Demeter , die sagt:

  • Ihre Methode kann direkt in seiner Klasse andere Methoden aufrufen
  • Ihre Methode Methoden auf seine eigenen Felder nennen kann direkt (aber nicht auf die Felder Felder)
  • Wenn Sie Ihre Methodenparameter nimmt, Ihre Methode Methoden auf diesen Parametern aufrufen können direkt.
  • Wenn Ihre Methode lokale Objekte erstellt, kann diese Methode Methoden auf den lokalen Objekte aufrufen.

Deshalb sollte man nicht eine Kette von Meldungen haben, z.B. a.getB().getC().doSomething(). Nach diesem „Gesetz“ hat viele weitere Vorteile neben machen Nullpointerexceptions leichter zu debuggen.

ich in der Regel nicht Kette Getter wie diese, wo es mehr als ein Nullable-Getter ist.

Wenn Sie in Ihrem IDE ausführen können Sie nur einen Haltepunkt setzen und verwenden Sie die „Ausdruck auswerten“ Funktionalität Ihres ide für jedes Element nacheinander.

Aber du wirst dein Kopf, den Moment zu kratzen Sie diese Fehlermeldung aus dem Produktionsserver-Protokollen erhalten. Also am besten halten max ein Nullable-Element pro Zeile.

Mittlerweile können wir träumen von sichere Navigation Bediener groovy

Frühausfall ist auch eine Option.

überall in Ihrem Code, der ein Nullwert zurückgegeben werden kann, sollten Sie einen Scheck für einen Null-Rückgabewert eingeführt werden.

public Foo getSomething()
{
  Foo result;
  ...
  if (result == null) {
    throw new IllegalStateException("Something is missing");
  }
  return result;
}

Hier ist, wie die Fehler zu finden, mit Eclipse.

Zuerst einen Haltepunkt in der Zeile:

someObject.getSomething().getSomethingElse().
getAnotherThing().getYetAnotherObject().getValue();

Starten Sie das Programm im Debug-Modus, kann der Debugger auf seine Perspektive wechseln, wenn die Leitung getroffen wird.

Nun markieren Sie "Someobject" und drücken Sie CTRL + SHIFT + I (oder die rechte Maustaste und sagt: "inspiziert").

Ist es null? Sie haben Ihre NPE gefunden. Ist es nicht null ist? Markieren Sie dann someObject.getSomething () (einschließlich der Klammern) und inspizieren. Ist es null? Weiter unten Etc. die Kette, um herauszufinden, wo Ihre NPE auftritt, ohne Ihren Code zu ändern.

Wenn Sie auf den Punkt zu bekommen sind, die in dem Sie die Linie sind Aufspaltung oder tun aufwendige Fehlersuche, das Problem zu erkennen, dann ist das im Allgemeinen Gottes Weg, Ihnen zu sagen, dass der Code nicht für die Null prüft früh genug .

Wenn Sie eine Methode oder Konstruktor, der einen Objektparameter und das Objekt / Methode in Frage, dass Parameter ist null umgehen kann nicht sinnvoll nimmt, dann nur überprüfen und eine Nullpointer dort und dann werfen.

Ich habe Regeln gesehen, wie Menschen erfinden „Codierung Stil“ runden dieses Problem zu versuchen und zu erhalten, wie „Sie sind nicht mehr als ein Punkt auf einer Linie erlaubt“. Aber dies nur ermutigt Programmierung, die den Fehler an der falschen Stelle spots.

Chained Ausdrücke wie, dass ein Schmerz für Nullpointerexceptions zu debuggen (und die meisten anderen Probleme, die auftreten können), so würde ich raten Ihnen, es zu versuchen und zu vermeiden. Sie haben wahrscheinlich, dass genug wenn und wie ein vorher bereits erwähnt gehört, dass Sie Pause Punkte auf dem tatsächlichen Nullpointer hinzufügen können, um zu sehen, wo sie sich ereignen.

In Eclipse (und die meisten IDEs) auch Überwachungsausdrücke verwenden können, Code bewerten im Debugger ausgeführt wird. Sie tun dies bu den Code auswählen und verwenden Sie die Contet Menü eine neue Uhr hinzuzufügen.

Wenn Sie die Kontrolle des Verfahrens sind, dass Sie auch die Null-Objekt-Muster in Erwägung ziehen könnte null zurückgibt, wenn null ein gültiger Wert ist zurück.

Setzen Sie jeden Getter auf seine eigene Linie und debuggen. Schritt über (F6) jede Methode zu finden, welche den Wert null zurück rufen

scroll top