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

If statement 在同一if语句中检查null和对象属性是否是一种好的做法,if-statement,conventions,If Statement,Conventions,在同一if语句中检查null和对象属性是否是一种好的做法 考虑以下代码: if (jamesBlunt != null && jamesBlunt.isReallyBad()) { // Don't buy his records } 这个特定的代码是用java编写的,我知道表达式是从左到右求值的,所以从技术上讲它不会抛出NullPointerException,但一般来说,这在任何语言中都是很好的做法吗?当您使用或语句时,如果jamesBlunt为null,则会出现Nu

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

考虑以下代码:

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

这个特定的代码是用java编写的,我知道表达式是从左到右求值的,所以从技术上讲它不会抛出NullPointerException,但一般来说,这在任何语言中都是很好的做法吗?

当您使用
语句时,如果
jamesBlunt
为null,则会出现
NullPointerException
。您应该使用
,因为如果left语句为false,则整个表达式将为false

使用:

当Java7退出时,您可以使用快捷方式

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

但在此之前,明确检查
null
将是最佳做法。(事实上,最好不要使用jamesBlunt对象…

当您使用
语句时,如果
jamesBlunt
为null,则会出现
NullPointerException
。您应该使用
,因为如果left语句为false,则整个表达式将为false

使用:

当Java7退出时,您可以使用快捷方式

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

但在此之前,明确检查
null
将是最佳做法。(事实上,最好不要使用jamesBlunt对象…

您希望使用&&而不是OR

是的,在同一个if语句中检查null是一种很好的做法,另一种方法(嵌套两个if)很难看,因为它添加了更多缩进


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

你想用&&而不是OR

是的,在同一个if语句中检查null是一种很好的做法,另一种方法(嵌套两个if)很难看,因为它添加了更多缩进


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

我假设
|
是一个打字错误,你的意思是
&
:)

回答你的问题:视情况而定

jamesBlunt
为空有意义吗?如果没有,那么最好是这样做:

void buyARecord(Artist jamesBlunt) {
    if (jamesBlunt == null) {
        throw new IllegalArgumentException("James should never be null!");
    }
}
如果
jamesBlunt
为null是有意义的,那么您的方法是正确的,假设
null
在语义上是完全错误的。如果它们在语义上意味着不同的东西,那么您可能不应该在一行中组合它们


在其他语言中你确实需要小心。许多(java、C++、C等)的行为方式相同,但有些可以从右到左进行评估或懒散地评估。请特别注意Lisp和Scheme等函数式语言,因为它们的行为往往与Java和C等面向对象语言不同。

我假设
|
是一个打字错误,您的意思是
&
:)

回答你的问题:视情况而定

jamesBlunt
为空有意义吗?如果没有,那么最好是这样做:

void buyARecord(Artist jamesBlunt) {
    if (jamesBlunt == null) {
        throw new IllegalArgumentException("James should never be null!");
    }
}
如果
jamesBlunt
为null是有意义的,那么您的方法是正确的,假设
null
在语义上是完全错误的。如果它们在语义上意味着不同的东西,那么您可能不应该在一行中组合它们


在其他语言中你确实需要小心。许多(java、C++、C等)的行为方式相同,但有些可以从右到左进行评估或懒散地评估。请特别注意Lisp和Scheme等函数式语言,因为它们的行为往往与Java和C#等面向对象语言不同。

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


这些可以使下面的代码更清晰,避免多层嵌套。如果您希望在所讨论的对象上测试其他内容,它还可以防止重复空检查。

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


这些可以使下面的代码更清晰,避免多层嵌套。如果您希望在所讨论的对象上测试其他内容,它还可以防止重复空检查。

是,因此它可以工作。我不知道这是否是“良好实践”,但我经常使用它——它只是比两级if更方便。MacGucky:事实上这是“最佳实践”,尽管检查是多余的,因为jamesBlunt对象总是空的。来自java7的有趣示例way@whatsthebeef:是的。我期待着改变是的,所以它的工作。我不知道这是否是“良好实践”,但我经常使用它——它只是比两级if更方便。MacGucky:事实上这是“最佳实践”,尽管检查是多余的,因为jamesBlunt对象总是空的。来自java7的有趣示例way@whatsthebeef:是的。我期待着改变谢谢大家,我听了太多詹姆斯·布朗特的CD,把问题搞砸了,我是说&¬ | |谢谢大家,我听了太多詹姆斯·布朗特的CD,把问题搞砸了,我是说&¬ | |是的,你是对的,多亏了你和其他回答者,问题终于以正确的格式出现了。在我想到的特定示例中,jamesBlunt为null是有意义的。是的,你是对的,谢谢