2017-04-08 27 views
1

我有這段代碼。它是在一個tMap的右手地圖行異常過濾器:處理OR語句中的空指針異常

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) 
) 

我有一個NullPointerException。我知道frequency不爲空,因爲是method。我知道last_notified爲空。根據我的邏輯,"Twitter"作爲值的所有行都不應該通過last_notified。但是,看起來我失敗了。

我瞭解OR語句從左到右。如果第一個值返回True,那麼OR應該返回true?我錯過了什麼?

回答

3

關於

row2.last_notified.equals(null) 

不要與equals方法測試空作爲風險拋出NPE異常,因爲你會試圖調用一個空變量的方法。始終使用==,因爲您沒有測試通知引用的值,而是引用本身是否爲空。

所以做

row2.last_notified == null 

另外,關於

row2.frequency == "Daily" 

這是完全相反這裏你比較字符串錯誤 - 使用equals(...)equalsIgnoreCase(...)方法來代替。瞭解==檢查兩個對象引用是否相同,這不是您感興趣的內容。另一方面,方法檢查兩個字符串是否具有相同順序的相同字符,這是重要的。

而是做:

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

這是真棒!非常感謝。當定時器允許我時,我會接受。 – arcee123