2010-01-08 108 views
26

假设我有以下表达式Java中评估的布尔表达式顺序?

Eclipse的警告我说,myString可能会在布尔表达式的第二句话是空的。但是,我知道一些编译器会在第一个条件失败时完全退出布尔表达式。这对于Java来说是否属实?或者评估的顺序没有保证?

+0

您正在使用哪种编译器或工具? – notnoop 2010-01-08 15:45:16

+0

为什么要重要? – danben 2010-01-08 15:46:23

+0

那么,javac(最常见的编译器)不会警告有关无效。如果“Java警告我myString可能为空”,那么最有可能是一个有问题的工具。没有“java警告”之类的东西。 – notnoop 2010-01-08 15:48:25

回答

44

但是,我知道一些编译器会完全退出布尔表达式,如果第一个条件失败。这对于Java来说是否属实?

是的,作为Short-Circuit evaluation .Operators像&&||是执行这样的操作的运算符是已知的。

或者是评估的顺序没有保证?

没有,评价的顺序是保证(从左至右)

1

是的,Java以这种方式实践了对if语句的懒惰评估。如果myString == null,则不会评估if语句的其余部分

7

Java应该从左向右评估您的语句。它使用一种称为short-circuit evaluation的机制来防止第二,第三和第n个条件在第一个条件为假时进行测试。

所以,如果你的表达是myContainer != null && myContainer.Contains(myObject)myContainer为空,第二个条件,myContainer.Contains(myObject)将不进行评估。

编辑:正如别人提到的那样,Java在布尔条件下确实同时具有短路和非短路操作符。使用&&将触发短路评估,并且&不会。

+1

引用:'为了防止第一,第三和第n个条件被测试,如果第一个是错误的'。实际上,如果运算符是“||”,如果第一个是错误的,编译器无法从第一个结论中得出总体值。 – H2ONaCl 2012-02-09 07:59:20

2

詹姆斯和Ed是正确的。如果遇到无论先前的失败条件如何都要评估所有表达式的情况,可以使用非短路布尔运算符&