我可以问一下,在Java中,我在IF
语句中突出(resultSet != null && resultSet.next())
,在调试模式(带断点)中突出DISPLAY
后,虽然结果返回TRUE
,但它似乎不会进入IF
语句?
try {
conn = new BaseDA().getConnection();
stmt = conn.prepareStatement(_sqlIns);
stmt.setInt(1, obj.getYrStart());
stmt.setInt(2, obj.getAge());
stmt.setDouble(3, obj.getBasicSaving());
ResultSet resultSet = stmt.executeQuery();
//can't get in after right-click DISPLAY
if (resultSet != null && resultSet.next()){
result = resultSet.getString(_colnm1);
}
}
首先…没有,编译器中没有错误!!
第二:你确定你得到了一些结果吗?如果是,继续解决方案:你没有根据Oracle文档建议迭代resultSet
,所以你只会得到一个结果,而不是完整的结果集:
while (rs.next()) {
}
所以你必须:
ResultSet resultSet = stmt.executeQuery();
while (resultSet.next()) {
result = resultSet.getString(_colnm1);
}
首先,没有编译器错误。如果调试器行为怪异,为什么会这样认为呢?
第二,stmt.executeQuery()
不能返回null,所以删除空检查。看到javadoc:
返回一个
ResultSet
对象,其中包含查询产生的数据;nevernull
调用resultSet.next()
将"cursor"移动到下一行。看到javadoc:
将光标从当前位置向前移动一行。
ResultSet
游标最初定位在第一行之前;方法next
的第一次调用使第一行成为当前行;第二个调用将第二行作为当前行,依此类推。
因此,如果您刚刚跳过了调试器中的executeQuery()
调用,则resultSet
位于第一行之前。
如果你要求调试器对表达式求值(使用"Display"),调试器实际上将调用 next()
方法,该方法将前进到第一行并返回true
。
当您随后遍历if
语句时,它将再次调用next()
方法,该方法将尝试前进到结果集的第二行。假设只返回一行,它将返回false
,而跳过if
块。
因此,通过在调试器中求值表达式,导致跳过唯一返回的行。
简而言之:注意在调试器中求值表达式的副作用。你不应该评估任何有副作用的东西。只计算幂等方法,例如getter, toString()
。