什么是短路以及在Java编程时如何使用它?

18 java short short-circuiting

可能重复:
在布尔结果已知之后,java是否评估剩余条件
为什么我们通常||不使用|,有什么区别?

前几天我错过了我的课堂讲座,我想知道是否有人可以解释短路是什么,也许是一个简单的Java程序中使用它的例子.谢谢你的帮助!

T.J*_*der 43

短路是指一旦确定结果就停止评估表达式.例如:

if (a == b || c == d || e == f) {
    // Do something
}
Run Code Online (Sandbox Code Playgroud)

如果a == b是真的,那么c == de == f从来没有在所有的评估,因为表达式的结果已经确定.if a == b为false,然后c == d进行评估; 如果它是真的,那么e == f永远不会被评估.这似乎没有任何区别,但请考虑:

if (foo() || bar() || baz()) {
    // Do something
}
Run Code Online (Sandbox Code Playgroud)

如果foo()返回true,那么barbaz从来没有所谓,因为表达式的结果已经确定.因此,如果bar或者baz除了返回某些东西(副作用)之外还有其他一些效果,那些效果永远不会发生.

一个很好的短路示例涉及对象引用:

if (a != null && a.getFoo() != 42) {
    // Do something
}
Run Code Online (Sandbox Code Playgroud)

a.getFoo()通常会抛出一个NullPointerException如果anull,但由于表达短路,如果a != nullfalse,该a.getFoo()部分不会发生,所以我们没有得到一个异常.

请注意,并非所有表达式都被短路.的||&&运营商都短路,但|&不是,也不是*/; 事实上大多数运营商都没有.