使用 && 和 || 的逻辑评估在一份声明中

Logic evaluation with && and || in a statement

我正在调试一些代码并找到了一些表达式:

if (mObject != null && a || b )
{
    mObject.someMethod();
}

在 mObject.someMethod() 行中有一个 NullPointerException - 所以我的问题是:

如何计算表达式?

1. a && b || c == a && (b || c) 

2. a && b || c == (a && b) || c

如果 1. 是这种情况,我可能不得不考虑一些多线程问题。

这可能是一个愚蠢的问题,我很确定以前有人问过它,但我在这里找不到答案。提前感谢您的回答。

相当于以下条件:

if ((mObject != null && a) || b )

&& 的优先级高于 ||.

如果 mObject 为空,如果 b 为真,则条件可能通过。

!= 优先于 && 优先于 || (Source)

因此

if (mObject != null && a || b )

等同于

if (((mObject != null) && a) || b )

为避免异常,请使用括号:

if (mObject != null && (a || b) )

根据here,它是:

((( mObject != null ) && a ) || b )

所以你应该研究 b,因为:

(null != null) is false
false && a is always false

那一切都取决于b。

如果没有提供括号,那么它将始终从等式表达式的左到右计算。