在OR语句中的talend中处理空指针异常

时间:2017-04-08 14:01:57

标签: java talend

我有这个代码。它是tMap的右侧地图中的行异常过滤器:

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?我错过了什么?

1 个答案:

答案 0 :(得分:3)

关于

row2.last_notified.equals(null)

不要使用equals方法测试null,因为冒着抛出NPE异常的风险,因为您将尝试在null变量上调用方法。始终使用==,因为您没有测试通知引用的值,而是测试引用本身是否为空。

所以

row2.last_notified == null

还有关于

row2.frequency == "Daily"

这与您在比较错误的字符串时完全相反 - 请改用equals(...)equalsIgnoreCase(...)方法。理解==检查两个对象引用是否相同而不是您感兴趣的内容。另一方面,这些方法检查两个字符串是否具有相同的字符。同样的顺序,这就是重要的事情。

取而代之的是:

row2.frequency.equals("Daily")