我在编写if语句时遇到了麻烦,如下所示:
public void foo(List<String> list)
{
if(list == null || list.isEmpty()){
// something
}
// else
}
这是困扰我的:如果list为null list.IsEmpty()将失败(抛出异常,我在空对象上调用方法),因为list为null。但是,因为我做了|| (或)如果list为null(这是真的),它将执行第二个块。会抛出异常。
这是对的吗?在英语中,如果列表为null或空有意义。这是这种情况吗?
为什么&amp;&amp; ?还是短路?
感谢。
答案 0 :(得分:28)
这是困扰我的:如果list为null list.IsEmpty()将失败(抛出异常,我在空对象上调用方法),因为list为null。
不,不会。 C#和Java中的||
运算符是短路。如果第一个操作数为true
,则不会计算第二个操作数。
有关详细信息,请参阅Java语言规范的section 15.24和C#4规范的第7.12节。
&&
运算符类似,但这次它不会在第一个操作数为false
时计算第二个操作数。所以写得很好:
if (list != null && list.size() > 0)
作为相反的条件。
答案 1 :(得分:6)
||
和&&
运营商进行短路评估。一旦结果已知,它就会停止评估操作数。
这使得在空检查后使用值成为可能。如果计算第二个操作数,则知道变量的状态。它经常与&&
运算符一起使用,而不是||
运算符:
if (x != null && x.something == 42) ...
|
和&
运算符不进行短路评估,因此可以保证评估两个操作数。
如果您在条件中执行某些操作,这可能很有用,您需要完成这两件事:
int x, y;
if ((x = GetValue()) != 0 & (y = GetValue()) != 0) {
// use x
// use y
}
然而,条件有副作用通常是代码味道,所以这样的代码不经常使用。
答案 2 :(得分:2)
通常,机器将首先评估最左边的条件,然后如果可以的话快捷方式。
一个好的经验法则是,如果真相可以完全由最左边的某个值确定(在你的情况下,如果list==null
评估为true
),那么它将忽略正确的部分。
答案 3 :(得分:2)
这是困扰我的:如果list为null list.IsEmpty()将失败
答案是否
当||
使用OR
运算符时,第二个条件仅在第一个条件失败时进行评估。当第一个条件为真时,不评估第二个条件。它称为Short Circuit
行为。
这是因为:
true || any value is always result into true
&&
(AND)也是如此,但条件相反,即如果第一个条件失败则第二个条件不被评估为:
false && any value is always going to be false.
希望这有助于您了解行为。