我的同事传给我一些代码,运行代码时出现问题。这是它的一部分
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以外的其他值。
这两种写作方式有什么区别?我知道两者应该以同样的方式工作。
答案 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。