2011-03-27 39 views
1

在相同的if语句中检查null和检查对象属性是否是一种好的做法?在相同的if语句中检查null和检查对象属性是否是好的做法

考虑下面的代码:

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

这个特殊的代码是在Java中,我知道从左至右所以在技术上也不会抛出NullPointerException表达式求值,但一般是在这个好习惯任何语言?

+0

谢谢大家,我已经听了太多的James Blunt的CD和搞砸的问题一点,我的意思是&&不|| – zode64 2011-03-28 00:09:54

回答

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#)有所不同。

+0

所做的更改,您是对的,这要感谢您和其他答复者,问题终于在正确的格式。在我想到的特定例子中,jamesBlunt是无效的。 – zode64 2011-03-28 00:20:32

3

由于您使用的是OR声明,如果jamesBlunt为空,将会有一个NullPointerException。您应该使用and,因为如果左语句为false,则整个表达式将为false。

用途:

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

当Java 7的出来了,你可以使用快捷键

if(jamesBlunt?.isReallyBad() { 
     // Don't buy his records 
} 

但在此之前的null明确的检查将是最好的做法。 (事实上​​,这将是最好的做法是不使用对象詹姆仕·布朗特...)

+0

是的,所以它的工作原理。我不知道这是否是“良好实践”,但我经常使用它 - 这比if的两个级别更方便。如果有人反对的话有很好的理由,会很感兴趣。 – MacGucky 2011-03-28 00:00:01

+1

@MacGucky:实际上这是“最佳实践”,虽然检查是多余的,因为jamesBlunt对象总是为NULL。 – Chris 2011-03-28 00:10:05

+0

谢谢我的不好。我的意思是从java7 && – zode64 2011-03-28 00:10:33

1

你想用& &,而不是OR。

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

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

1

就我个人而言,我会分开这些。空检查是人们在函数开始时要做的事情,通常用来验证函数参数,通常称为“守卫子句”。这些检查通常会引发异常或返回由该函数定义的错误代码。

这些可以导致下面更清洁的代码,避免了多层次的嵌套。它还可以防止在需要测试的对象上有其他事情时重复空检查。

相关问题