2014-03-04 26 views
0

我真搞不清楚这个问题,我有一个返回boolean值的方法 - mainMethod(),所以我用的结果在逻辑表达式,在这里看到:Java方法不calledin表达

boolean b = this.someMethod(); 
    b = b && this.mainMethod(); // method is not called 

我检查jar文件通过反编译器一切正常。然后我将上面的行更改为:

boolean b = this.someMethod(); 
    boolean result = this.mainMethod(); // now method is called!!! 
    b = b && result; 

是否有人知道这会发生什么?我不知道,这看起来很奇怪。

+0

如果'B'已经在第一个例子中'false'它不会继续超过'&&'。 – AntonH

+0

OH !!!!!当然可以......谢谢 – Martin

+0

您可以使用按位运算符'&&来避免短路。您可以通过使代码自行记录来避免这样的错误。没有人知道'mainMethod()'返回'true'或'false'意味着什么。如果你已经将它分配给一个像'boolean ranSuccessfully'这样的变量,那么你应该避免这个错误,并且清楚你的代码在做什么。 – Rainbolt

回答

6

如果this.someMethod()回报false然后this.mainMethod()将永远不会被因在声明中

b = b && this.mainMethod(); 
0

&&调用到&&运营商短路自然是conditional and operator。在表达

a && b 

如果afalseb将不进行评估,因为整个表达式会falseb仅在atrue时才被评估。

那么发生了什么事是someMethod正在返回false; mainMethod然后不被执行,因为已知整个表达式将评估为false,而不管从mainMethod返回的值如何。

0

如果“B”已经是假的,这是没有必要的评估第二表达式:

true AND ? <= ? must be evaluated 
false AND ? <= = must not be evaluated as 

false AND true => false 
false AND false => false 

所以它不事关什么第二个表达式求。

0

以前的答案是正确的。有短路的性质。

false && method() 

永远不会执行方法(),因为布尔值已经是false,所以没有任何东西可以使值返回true。在这种情况下,你正在寻找分配一个布尔值,所以它将停止评估语句。

如果您需要评估这两种方法,仍然有布尔结果返回您需要执行的代码通过以下方式之一:

boolean b = methodA(); 
b &= methodB(); 

boolean b = methodA(); 
b = methodB() && b;