假设我有以下表达式Java中评估的布尔表达式顺序?
Eclipse的警告我说,myString
可能会在布尔表达式的第二句话是空的。但是,我知道一些编译器会在第一个条件失败时完全退出布尔表达式。这对于Java来说是否属实?或者评估的顺序没有保证?
假设我有以下表达式Java中评估的布尔表达式顺序?
Eclipse的警告我说,myString
可能会在布尔表达式的第二句话是空的。但是,我知道一些编译器会在第一个条件失败时完全退出布尔表达式。这对于Java来说是否属实?或者评估的顺序没有保证?
但是,我知道一些编译器会完全退出布尔表达式,如果第一个条件失败。这对于Java来说是否属实?
是的,作为Short-Circuit evaluation .Operators像&&
和||
是执行这样的操作的运算符是已知的。
或者是评估的顺序没有保证?
没有,评价的顺序是保证(从左至右)
是的,Java以这种方式实践了对if语句的懒惰评估。如果myString == null,则不会评估if语句的其余部分
Java应该从左向右评估您的语句。它使用一种称为short-circuit evaluation的机制来防止第二,第三和第n个条件在第一个条件为假时进行测试。
所以,如果你的表达是myContainer != null && myContainer.Contains(myObject)
和myContainer
为空,第二个条件,myContainer.Contains(myObject)
将不进行评估。
编辑:正如别人提到的那样,Java在布尔条件下确实同时具有短路和非短路操作符。使用&&
将触发短路评估,并且&
不会。
引用:'为了防止第一,第三和第n个条件被测试,如果第一个是错误的'。实际上,如果运算符是“||”,如果第一个是错误的,编译器无法从第一个结论中得出总体值。 – H2ONaCl 2012-02-09 07:59:20
詹姆斯和Ed是正确的。如果遇到无论先前的失败条件如何都要评估所有表达式的情况,可以使用非短路布尔运算符&
。
您正在使用哪种编译器或工具? – notnoop 2010-01-08 15:45:16
为什么要重要? – danben 2010-01-08 15:46:23
那么,javac(最常见的编译器)不会警告有关无效。如果“Java警告我myString可能为空”,那么最有可能是一个有问题的工具。没有“java警告”之类的东西。 – notnoop 2010-01-08 15:48:25