分配布尔变量值和在Java中分配比较结果之间的区别

时间:2015-12-23 08:57:12

标签: java boolean variable-assignment

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

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);
}

这总是打印购买为假。我改变了这一部分:

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

现在它完美无缺。

注意:我的ResultSet只能有1条记录。在DB 购买的类型,因此不能有除0/1以外的其他值。

这两种写作方式有什么区别?我知道两者应该以同样的方式工作。

5 个答案:

答案 0 :(得分:11)

  

这两种写作方式有什么区别?我知道两者应该以同样的方式工作。

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

在您的第二段代码中,purchased设置为true后,其余部分将保持true

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

答案 1 :(得分:4)

实际上这段代码与您同事的代码相同:

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

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

答案 2 :(得分:1)

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

您的版本似乎完全不正确。

答案 3 :(得分:1)

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

如果没有while循环(如果第一个记录返回值为1)或者ResultSet只有一个值为1的记录,则不会产生影响。

第一个代码中的

while循环可能在第二次迭代中设置false值左右。因此,在while循环的退出时间,已购买的值为false。第二种方式,当值为1时,您将已购买值设置为true,并且不会再次重置为false(因为已购买值未重置对于ResultSet的其他行)。

希望它有所帮助!!

答案 4 :(得分:0)

我同意 Jon Skeet ,在第一个回答中,值会在while循环的每次迭代中发生变化,但在第二段代码中,boolean的值变量每次都不会改变。

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