【问题标题】:Java Boolean Check [duplicate]Java布尔检查[重复]
【发布时间】:2017-04-15 20:30:26
【问题描述】:

我在 Java 8 上工作,但有一个简单的问题我还没有弄清楚。

我有 3 种方法来验证来自 db 的数据,并根据它们是否得到一行来返回 true 或 false。棘手的部分是,即使我知道第一部分 返回 false,我仍然希望它检查其他两种方法。我的代码是这样写的:

boolean flag = true;

flag = flag && validateMethod1();
flag = flag && validateMethod2();
flag = flag && validateMethod3();

return flag;

问题是,当 validateMethod1() 返回 false 时,它​​没有调用 validateMethod2()。有人可以解释为什么吗? 我试过这个:

 boolean flag = true;

    flag = flag & validateMethod1();
    flag = flag & validateMethod2();
    flag = flag & validateMethod3();

    return flag;

仍然面临同样的问题。

【问题讨论】:

  • 因为如果一个运算符为假,则永远不可能为真。
  • 但是为什么要这样做,&& 表示如果一个false 那么结果是false
  • @Mritunjay 也许validateMethod2validateMethod3 有副作用
  • 其实我的要求是修改数据库以防为假。所以我想检查所有的方法。

标签: java boolean


【解决方案1】:

&& 是一个短路的 AND 运算符。如果第一个操作数被评估为false,它不会评估第二个操作数。

为了计算所有操作数,请使用 AND 运算符的非短路版本:

return validateMethod1() & validateMethod2() & validateMethod3();

如您所见,您的逻辑可以简化为一行代码。

【讨论】:

  • 一方面是的,另一方面在设计代码时出了点问题。
  • 如果我想要旧格式怎么办?我应该将它保存在单独的布尔变量中,然后使用'&'吗?
  • @AnkushBhan 您可以使用您的原始代码并将&& 替换为&,但它看起来不是很优雅。使用单独的布尔变量也可以(但您可以使用&&&,因为AND 运算符只会在3 个方法执行后应用)。
  • @Eran 我理解,但是如果我有超过 25 种这样的方法,并且对于每种方法我想检查布尔结果并移至下一个方法怎么办?顺便说一句,我使用了 '&' 而不是 ' &&'。仍然给出同样的问题
  • @AnkushBhan & 应该可以正常工作。尝试将打印语句添加到验证方法中,您会看到所有这些语句都已执行(除非抛出一些异常)。
【解决方案2】:

Java 使用表达式的排序电路求值 - 即,一旦它确定结果将是 false,它就会停止求值。

由于你的表达式是连词,一旦flag被发现是假的,很明显整个表达式都是假的。

一种解决方法(相当冗长)是:

boolean flag1 = validateMethod1();
boolean flag2 = validateMethod2();
boolean flag3 = validateMethod3();
return flag1 && flag2 && flag3;

【讨论】:

    【解决方案3】:

    那是因为您使用短路 && 而不是 &,这导致在这种情况下只检查第一个参数,当此参数为 false

    & 运算符,当用作逻辑运算符时,总是计算两边。

    【讨论】:

      猜你喜欢
      • 2014-05-06
      • 2019-06-30
      • 1970-01-01
      • 2013-04-02
      • 2013-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多