2016-04-13 2 views
4

NullPointerException ist immer ein Code-Clutterer. Sie müssen prüfen, ob jedes Objekt null-sicher ist und keine NPE werfen.Wie die NullPointerException sichere Methode und Ausdrücke zu codieren?

stieß ich auf eine Situation:

public void aMethod(Employee emp){ 
    String fullEmployeeDetailRow = "Name: "+emp.getName().getFirstName() 
    +"LastName :"+emp.getName().getFirstName() 
    +"Address:" 
    +emp.getAddress().getBillingAddress().getBuildingNumber().getApartmentNumber() 
    +" "  
    +emp.getAddress().getBillingAddress().getStreetName() 
    } 

In obigem Beispiel gibt es so viele Möglichkeiten der NPE ist. Zum Beispiel in

emp.getAddress().getBillingAddress().getBuildingNumber().getApartmentNumber() 

Ausdruck, rufen zu

getAddress() or getBillingAddress() or getBuildingNumber() 

jeder null und wahrscheinlich NPE Quelle sein kann. Also muss ich jetzt meinen Code durcheinander bringen, um zu prüfen, ob jeder null sein kann.

Meine Frage/Der Gedanke ist: Gibt es eine Möglichkeit in Java, ein Verfahren zu schaffen, die einen Ausdruck nimmt und zu bewerten, ob es NullPointerException wirft und wenn ja dann einen Standardwert zurückgeben, sagen eine leere " "?

Also in diesem Fall brauche ich eine Methode

expression=emp.getAddress().getBillingAddress().getBuildingNumber().getApartmentNumber()

String checkForNPE(expression){ 
    try{ 
     return expression; 
     }catch(NullPointerException e){ 
     return " " // default Value 
     } 
    } 

Problem ist, wenn ich versuche, eine Methode wie diese zu erstellen, und übergeben ihm einen Ausdruck wertet Java den Ausdruck VOR dem Aufruf Methode und NPE wird vorher geworfen!

Wie kann ich den Ausdruck an die Methode übergeben und Java nur innerhalb der Methode auswerten lassen?

+0

Warum machen Sie nicht den Versuch Block dort, wo Sie den Ausdruck initialisieren? – Dimi

+0

@Dimi Das versuche ich zu vermeiden. Ich versuche zu vermeiden, den Ausdruck in meinem Hauptcode zu überprüfen, um Null-Check/NPE-Code-Durcheinander zu vermeiden und zu versuchen, diese try/catch-Prüfung auf eine separate checkForNPE() -Methode zu verschieben. Wie kann ich viele solche Ausdrücke um den gleichen Ort (siehe mein Beispiel) und delegiere diesen Check-Code nur zu einem CheckForNPE() und für alle Ausdrücke wiederverwenden. – supernova

Antwort

6

Sie können optional in dieser Situation verwenden.

Option.ofNullable(emp) 
     .map(e -> e.getAddress()) 
     .map(a -> a.getBillingAddress()) 
     .map(a -> a.getBuildingNumber()) 
     .map(n -> n.getApartmentNumber()) 
     .orElse("not set") 
+0

Danke. Wird diese Java 8-Funktion erkunden. Gibt es eine ähnliche Lösung in Pre-Java 8? – supernova

+1

Basierend auf Ihrer Antwort, dieser Artikel präsentiert meine Frage richtig und Ihre Antwort auch. http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html – supernova

+0

@supernova Es könnte Bibliotheken geben, die dies unterstützen, aber ohne Lambdas wäre dieser Code viel ausführlicher. –

2

Nullpointer ist immer ein Code cluttrer.

Ich stimme nicht zu.

müssen, wenn jedes Objekt überprüfen null sicher ist und keine NPE nicht

werfen, die nicht unbedingt wahr. Es ist oft der Fall, dass das Erlauben einer NPE, von der Methode geworfen zu werden, das Vernünftigste ist, was Sie tun können, wenn eine Referenz, die es zu verwenden versucht, unerwartet null ist. Sicherlich nimmt die Standardbibliothek diesen Ansatz an vielen Stellen ein. Der wahrscheinlichste Grund, um zu "verifizieren", dass jede Referenz nicht-null ist, ist ein künstlicher Standard, der von außen auferlegt wird.

Meine Frage/Der Gedanke ist, ist es eine Möglichkeit, in Java, ein Verfahren zu schaffen, die einen Ausdruck nimmt und zu bewerten, wenn es Nullpointer werfen und wenn ja dann einen Standardwert sagen leer „Rückkehr“.

Ich zögere zu sagen, dass es unmöglich ist, aber sicherlich gibt es keine leicht Weise ein Mehrzweckverfahren, zu schreiben, wie Sie beschreiben. Java bietet keine Möglichkeit, Java-Quellcode zur Laufzeit zu evaluieren. Außerdem, was wäre der Punkt?Anstatt eine solche Methode aufzurufen, können Sie einfach den Code innerhalb eines try Blocks ausführen; Wenn es eine NPE wirft, dann fange es und handle mit der Situation, wie es angemessen ist. Es besteht keine Notwendigkeit, den Ausdruck vorab zu testen.

Wie kann ich den Ausdruck an die Methode übergeben und Java nur innerhalb der Methode auswerten lassen?

Sie können nicht. Oder zumindest, Java macht das nicht möglich, wie ich bereits sagte. Der Ausdruck, den Sie als Methodenargument verwenden, wird vor dem Aufruf der Methode ausgewertet, und eine Kopie des Ergebnisses wird an die Methode übergeben. Verwenden Sie wiederum direkt eine try/catch - so ziemlich alles andere, was Sie in Betracht ziehen könnten, ist viel komplizierter und teurer.

Alternativ dazu gibt es Ansätze wie @ PeterLawreys, die es einfacher und schöner machen, jede einzelne Referenz zu testen. Das hast du nicht gefragt, aber vielleicht passt es dir.

Verwandte Themen