2 Stimmen

Bewährte Verfahren in Bezug auf NPE und mehrere Ausdrücke in einer Zeile

Ich frage mich, ob es eine akzeptierte Praxis ist oder nicht, mehrere Anrufe auf derselben Leitung im Hinblick auf mögliche NPEs zu vermeiden, und wenn ja, unter welchen Umständen. Zum Beispiel:

anObj.doThatWith(myObj.getThis());

gegen

Object o = myObj.getThis();
anObj.doThatWith(o);

Letzteres ist etwas ausführlicher, aber wenn ein NPE auftritt, wissen Sie sofort, was der Grund dafür ist. null . Es erfordert jedoch auch die Erstellung eines Namens für die Variable und weitere Importanweisungen.

Meine Fragen in diesem Zusammenhang sind also:

  • Ist dieses Problem etwas wert um dieses Problem herum zu gestalten? Ist es besser, sich für die erste oder die zweite Möglichkeit zu wählen?
  • Hat die Erstellung eines Variablennamens Auswirkungen auf die Leistung?
  • Gibt es einen Vorschlag zur Änderung der Ausnahmeregelung Nachricht zu ändern, um bestimmen zu können, was Objekt ist null in künftigen Versionen von Java ?

5voto

Stephen C Punkte 665668

Ist es sinnvoll, dieses Problem zu umgehen? Ist es besser, sich für die erste oder zweite Möglichkeit zu entscheiden?

IMO, nein. Entscheiden Sie sich für die Version des Codes, die am lesbar .

Wenn Sie einen NPE erhalten, den Sie nicht diagnostizieren können entonces ändern Sie den Code nach Bedarf. Alternativ können Sie den Code auch mit dem Debugger ausführen und mithilfe von Haltepunkten und Einzelschritten herausfinden, woher der Nullzeiger kommt.

Hat die Erstellung eines Variablennamens Auswirkungen auf die Leistung?

Das Hinzufügen einer zusätzlichen Variablen kann die Größe des Stack-Frames erhöhen oder die Zeit, in der einige Objekte erreichbar bleiben, verlängern. Beide Effekte sind jedoch wahrscheinlich nicht signifikant.

Gibt es einen Vorschlag, die Ausnahmemeldung zu ändern, um in zukünftigen Versionen von Java feststellen zu können, welches Objekt null ist?

Nicht, dass ich wüsste. Die Implementierung einer solchen Funktion würde wahrscheinlich erhebliche Leistungseinbußen mit sich bringen.

3voto

SLaks Punkte 832502

En Das Gesetz der Demeter sagt ausdrücklich, dass dies nicht geschehen soll.

2voto

rsp Punkte 22749

Wenn Sie sicher sind, dass getThis() kann nicht eine null Wert, ist die erste Variante in Ordnung. Sie können in Ihrem Code Vertragsanmerkungen verwenden, um solche Bedingungen zu prüfen. Zum Beispiel verwendet Parasoft JTest eine Annotation wie @post $result != null und kennzeichnet alle Methoden ohne die Anmerkung, die den Rückgabewert ohne Prüfung verwenden.

Wenn die Methode Folgendes zurückgeben kann null sollte Ihr Code immer die zweite Variante verwenden und den Rückgabewert überprüfen. Nur Sie können entscheiden was zu tun ist, wenn der Rückgabewert null kann es in Ordnung sein, oder Sie sollten einen Fehler protokollieren:

Object o = getThis();

if (null == o) {
    log.error("mymethod: Could not retrieve this");
} else {
    o.doThat();
}

0voto

RonK Punkte 9156

Ich persönlich mag das Einzeiler-Code-"Entwurfsmuster" nicht, daher schließe ich mich all jenen an, die sagen, man solle den Code lesbar halten. Allerdings habe ich in ähnlichen Projekten schon viel schlimmere Codezeilen gesehen:

someMap.put(
     someObject.getSomeThing().getSomeOtherThing().getKey(),
     someObject.getSomeThing().getSomeOtherThing()) 

Ich denke, niemand würde bestreiten, dass dies nicht der richtige Weg ist, um wartbaren Code zu schreiben.

Was die Verwendung von Annotationen betrifft, so verwenden leider nicht alle Entwickler dieselbe IDE und Eclipse-Benutzer würden nicht von der @Nullbar y @NotNull Anmerkungen. Und ohne die IDE-Integration haben diese keinen großen Nutzen (abgesehen von etwas zusätzlicher Dokumentation). Ich empfehle jedoch die behaupten. Fähigkeit. Es hilft zwar nur während der Laufzeit, aber es hilft, die meisten NPE-Ursachen zu finden, hat keine Auswirkungen auf die Leistung und macht die Annahmen, die Ihr Code macht, klarer.

0voto

Ian Dallas Punkte 11921

Wenn es mir wäre, würde ich den Code zu Ihrer letzten Version ändern, aber ich würde auch Logging (vielleicht drucken) Anweisungen mit einem Framework wie log4j hinzufügen, so dass, wenn etwas schief ging ich die Log-Dateien überprüfen könnte, um zu sehen, was null war.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X