使用 && 和 || 的逻辑评估在一份声明中
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。
如果没有提供括号,那么它将始终从等式表达式的左到右计算。
我正在调试一些代码并找到了一些表达式:
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。
如果没有提供括号,那么它将始终从等式表达式的左到右计算。