繁体   English   中英

在Java中为布尔变量赋值和对比较结果赋值之间的区别

[英]Difference between assigning a boolean variable a value and assigning a result of a comparison in Java

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

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之外没有其他值。

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

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

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

在你的第二个代码片段,一旦purchased已被设置为true ,它保持true的环路的其余部分。

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

实际上,此代码等效于您的同事的代码:

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

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

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

您的版本似乎根本不正确。

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

没有while循环(如果第一条记录返回的值是1)或ResultSet只有一条记录的值是1的话,这不会有什么不同。

第一个代码中的while循环可能在第二个迭代中设置了false值。 因此,在while循环的退出时间,所携带的购买价值为false 第二种方法是,当value为1时将购买的值设置为true,并且不会再次重置为false (因为对于ResultSet的其他行未重置购买的值)。

希望能帮助到你 !!

我同意乔恩·斯基特Jon Skeet)的观点,在您的第一个答案中,值在while循环的每次迭代中都会更改,但是在第二段代码中,布尔变量的值不会每次都更改。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM