检查null并在同一if语句中检查对象属性是一种好习惯

时间:2011-03-27 23:53:49

标签: if-statement conventions

在同一个if语句中检查null并检查对象属性是不错的做法?

请考虑以下代码:

if (jamesBlunt != null && jamesBlunt.isReallyBad()) {
   // Don't buy his records
}

这个特殊的代码是在java中,我知道表达式是从左到右计算的,所以从技术上来说它不会抛出NullPointerException,但一般来说这是任何语言的好习惯吗?

3 个答案:

答案 0 :(得分:1)

你想使用&&而不是OR。

是的,最好在同一个if语句中检查null,替代方法(嵌套两个ifs)很难看,因为会增加更多的缩进。

但之前检查也没关系:特别是如果你想做一些错误检查。

答案 1 :(得分:1)

我认为||是拼写错误,你的意思是&&:)

回答你的问题:这取决于。

jamesBlunt永远为空是否有意义?如果没有,那么最好有这样的做法:

void buyARecord(Artist jamesBlunt) {
    if (jamesBlunt == null) {
        throw new IllegalArgumentException("James should never be null!");
    }
}

如果jamesBlunt为空是有意义的,那么您的方法很好,假设nullisReallyBad在语义上意味着相同的事情。如果它们在语义上意味着不同的东西,那么你可能不应该将它们组合在一条线上。

你需要小心其他语言。许多(Java,C ++,C#等)的行为方式相同,但有些可能会从右向左进行评估或懒惰评估。特别注意像Lisp和Scheme这样的函数式语言,因为它们往往与Java和C#等面向对象语言的行为不同。

答案 2 :(得分:1)

就个人而言,我会将这些分开。空检查是在函数开头做的事情,通常用于验证函数参数,通常称为“保护子句”。这些检查通常会引发异常或返回函数定义的错误代码。

这些可以使代码更清晰,避免多级嵌套。如果您希望在相关对象上测试其他内容,它还可以避免重复空检查。