【问题标题】:How to properly handle if statements containing both null checks and non-null checks together in an OR expression [duplicate]如何正确处理在 OR 表达式中同时包含空检查和非空检查的 if 语句 [重复]
【发布时间】:2023-01-10 17:13:44
【问题描述】:

我有一些代码执行以下操作:

if(object == null || object.value.equals(" ")) {
    // do something
}
else {
   // do something else 
}

上面的内容对我来说似乎很危险,因为如果我切换两个条件的顺序或将其更改为 AND 表达式,则当对象为 null 时代码将崩溃,但我还在某处读到 Java 保证从左到右计算操作数。也就是说,我也读过不要假设这是真的。

我对所有这些相互矛盾的建议感到困惑,想知道上面的代码是否构成错误。也就是说,如果这确实被认为是不好的做法,那么重新编码的最佳方法是什么?

【问题讨论】:

    标签: java specifications operands


    【解决方案1】:

    在 Java 中 &&||短路(布尔值!)运算符。所以一切正常.没有不必要的评估遇到错误。一些语言命名这些然后,要不然.

    boolean newGraphRequired = graphNode == null
        || gaphNode.timeStamp() != moduleNode.timeStamp();
    

    条件变得更加简单。

    【讨论】:

    • 这与我将它放在 if 语句中完全一样。如果这被认为是优雅的方法,那就是我更喜欢的:)
    • 是的,这就是我添加答案的原因:其他答案走得太远了。
    • 我会编辑我的代码,先生...谢谢
    • 不是“快捷方式”,而是short circuit
    • @Bohemian,感谢指正。想象一下传播序言。
    【解决方案2】:

    使用下面的代码 -

      if(object == null || (object != null && " ".equals(object.value))) {
            // do something
        }
        else {
            // do something else 
        }
    

    也始终在等号的左侧保持常量值,这将防止 NPE。

    对于上面的代码,如果 object 为 null 或 object.value 为“”(空格),它将进入内部,否则将进入 else。

    【讨论】:

    • 如果该值不是常量怎么办?
    • 如果值不是常量,那么您将不得不再添加一个空值检查作为 - object != null && null != object.value && object.value.equals("other non constant value")。另外,我并不是在谈论 object.value 是恒定的,在您的情况下,它是另一个像空间一样的东西。
    • @Lauren_G 做" ".equals(object.value) 的原因是因为" " 是一个“常量”,并且保证不是nullString#equals(Object) 方法将返回 false 如果参数是 null (它不会抛出 NPE)。
    • object != null 测试在这个地方已经过时了。此时不能是null
    【解决方案3】:

    您可以在 java 中使用 Objects 类的内置函数。 Reference Link

    if (Objects.isNull(object) || Objects.nonNull(object) && " ".equals(object.value)) {
        // do something
    }
    else {
       // do something else 
    }
    

    【讨论】:

    • 这解决了哪个问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    • 2020-02-02
    • 1970-01-01
    相关资源
    最近更新 更多