【问题标题】:Difference between assigning a boolean variable a value and assigning a result of a comparison in Java在 Java 中为布尔变量赋值和为比较结果赋值之间的区别
【发布时间】:2016-03-29 15:57:32
【问题描述】:

同事传给我一些代码,运行代码时出现问题。这是其中的一部分

boolean purchased = false;
conn = DriverManager.getConnection(connectionUrl, connectionUser, connectionPassword);
stmt = conn.createStatement();
String sql = new StringBuilder().... // some query

rs = stmt.executeQuery(sql);
while (rs.next()) {
    //some code
    purchased = rs.getInt("purchased") == 1;
    print(" purchased:" + purchased);
}

这总是打印为 false 购买的。我把那部分改成了这样:

while (rs.next()) {
    //some code
    if(rs.getInt("purchased") == 1) purchased = true;
    print(" purchased:" + purchased);
}

现在它可以完美运行了。

注意: 我的 ResultSet 只能有 1 条记录。而在 DB purchased 中是 bit 类型,所以除了 0/1 之外没有其他值。

这两种写法有什么区别?据我所知,两者应该以相同的方式工作。

【问题讨论】:

  • (1) 如果一个值可以是01,那么它实际上是Java 中的一个布尔值。 (2)如果rs只有1条记录,while循环不会运行一次吗?循环会运行多次吗?

标签: java boolean variable-assignment


【解决方案1】:

这两种写法有什么区别?据我所知,两者应该以相同的方式工作。

不,绝对不是。在您的第一段代码中,如果rs.getInt("purchased") 返回的值不是 1,则您分配的值是false

在您的第二段代码中,一旦将purchased 设置为true,它在循环的其余部分中将保持true

所以假设您的第一行对于purchased 的值为1,而您的第二行的值为2,那么在您的第一段代码中,变量将变为true,然后变为false,但在您的第二段代码变量将在第一次迭代中设置为true,然后在第二次迭代中不会更改。

【讨论】:

  • 我稍微编辑了我的问题,因为忘了提,ResultSet 中只能有 1 条记录。同样在 DB Purchased 中是 0 或 1,因此使用 1 以外的其他值没有问题。
  • @Astgh:嗯,我怀疑你误会了只有一张唱片。你调试过代码吗?基本上,我已经解释了这两段代码之间的区别......其余的取决于你。
【解决方案2】:

其实就是这段代码相当于你同事的代码:

while (rs.next()) {
    // some code
    if(rs.getInt("purchased") == 1) 
        purchased = true;
    else purchased = false;
    print(" purchased:" + purchased);
}

现在它们的行为将相同,因为一旦设置,purchased 就不会永远设置为 true

【讨论】:

  • 我同意,你是对的。但我错过了只有一条记录,所以else 在这种情况下没有做任何改变,正如我所想的那样,我也检查了添加/删除else =)
【解决方案3】:

不同之处在于,一旦变量变为真,您就永远不会将其更改为假。您需要根据方法的约定或预期的行为来确定哪个是正确的。

您的版本似乎不太可能是正确的。

【讨论】:

    【解决方案4】:

    ResultSet 和对应的值有多少条记录?

    如果没有while 循环(如果第一条记录返回值为 1 )或 ResultSet 只有一条值为 1 的记录,则不会有任何不同。

    第一个代码中的while 循环可能会在第二次迭代左右设置false 值。所以在while循环退出的时候,purchased被携带的值是false。第二种方式,当值为 1 时,您将 purchased 值设置为 true,并且不会再次重置为 false(因为 purchased 值不会为其他值重置结果集的行)。

    希望对你有帮助!!

    【讨论】:

    • ResultSet 中只能有 1 条记录。所以第二个循环没有问题。
    • 如果只有一条记录并且rs.getInt() 返回 1,那么两个代码都将打印true
    • 这就是我要说的。我只是错过了主要问题中的那一部分。我马上添加。
    • 所以即使在这种情况下,两个代码的行为也不同?
    • 我认为,您还需要编辑问题以指定您的数据库和实际的数据库数据类型。粘贴数据库表 SELECT 查询结果的快照。
    【解决方案5】:

    我同意 Jon Skeet 的观点,即在您的第一个答案中,值在 while 循环的每次迭代中都会发生变化,但在第二段代码中,布尔值的值变量不会每次都改变。

    我不知道您的要求,但我认为您还应该在代码中添加 else 部分以更改布尔值 rs.getInt("purchased") 的值,而不是 1 ,因为在您现有的代码中,您只需将布尔变量设为 true .

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 2023-04-06
      • 1970-01-01
      • 2018-08-06
      • 1970-01-01
      • 2015-12-18
      • 1970-01-01
      • 2020-03-24
      相关资源
      最近更新 更多