【问题标题】:handling null pointer exception in talend in OR statement在 OR 语句中处理 talend 中的空指针异常
【发布时间】:2017-04-08 14:01:56
【问题描述】:

我有这个代码。它是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?我错过了什么?

【问题讨论】:

    标签: java talend


    【解决方案1】:

    关于

    row2.last_notified.equals(null)
    

    不要使用equals 方法测试null,因为这有可能引发NPE 异常,因为您将尝试在null 变量上调用方法。始终使用==,因为您不是在测试通知引用的值,而是测试引用本身是否为空。

    也是这样

    row2.last_notified == null
    

    还有关于

    row2.frequency == "Daily"
    

    当您比较错误的字符串时,情况正好相反——请改用equals(...)equalsIgnoreCase(...) 方法。了解== 检查两个 对象引用 是否相同,这不是您感兴趣的。另一方面,这些方法检查两个字符串是否以相同的顺序具有相同的字符,这就是这里的重点。

    改为:

    row2.frequency.equals("Daily")
    

    【讨论】:

    • 这太棒了!太感谢了。当计时器允许时,我会接受。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    相关资源
    最近更新 更多