2017-04-08 2 views
1

Ich habe diesen Code. es ist die Reihe Ausnahmefilter in der rechten Karte eines tMap:Umgang Null Zeiger Ausnahme in Talend in OR-Anweisung

row2.method.equals("Twitter") && (
    row2.last_notified.equals(null) || 
    row2.frequency.equals("Everytime") || 
    (row2.frequency == "Hourly" && TalendDate.diffDate(TalendDate.addDate(row2.last_notified,1,"HH"), TalendDate.parseDate("yyyy-MM-dd HH:mm:ss", TalendDate.getDate("yyyy-MM-dd HH:mm:ss")), "HH") > 0) || 
    (row2.frequency == "Daily" && TalendDate.diffDate(TalendDate.addDate(row2.last_notified,1,"dd"), TalendDate.parseDate("yyyy-MM-dd HH:mm:ss", TalendDate.getDate("yyyy-MM-dd HH:mm:ss")), "dd") > 0) 
) 

Ich habe eine Nullpointer. Ich weiß, dass frequency nicht null ist, ebenso wie method. Ich weiß, dass last_notified null ist. basierend auf meiner Logik sollten alle Zeilen mit "Twitter" als Wert ohne last_notified übergeben werden. Es sieht jedoch so aus, als wäre ich damit gescheitert.

Ich verstand, dass OR-Anweisungen von links nach rechts gehen. Wenn der erste Wert True zurückkommt, dann sollte der OR SOLL zurückkehren? Was vermisse ich?

Antwort

3

In Bezug auf

row2.last_notified.equals(null) 

nicht für null mit dem equals Methode testen Sie, wie die Risiken der NPE Ausnahme zu werfen, da Sie auf eine Null-Variable eine Methode aufrufen werde versuchen. Verwenden Sie stattdessen immer ==, da Sie nicht den Wert des gemeldeten Verweises testen, sondern ob der Verweis selbst null ist.

tun So

row2.last_notified == null 

Auch in Bezug auf

row2.frequency == "Daily" 

Es ist das genaue Gegenteil hier wie Sie vergleichen Strings falsch - verwenden die equals(...) oder die equalsIgnoreCase(...) Methode statt. Verstehen Sie, dass == überprüft, ob die beiden Objektreferenzen die gleichen sind, was nicht das ist, was Sie interessiert. Die Methoden auf der anderen Seite überprüfen, ob die beiden Zeichenfolgen die gleichen Zeichen in der gleichen Reihenfolge haben, und das ist was hier zählt.

Stattdessen tun:

row2.frequency.equals("Daily") 
+0

Das ist genial! ich danke dir sehr. Ich werde akzeptieren, wenn der Timer es mir erlaubt. – arcee123