编译器中的Bug

  • 本文关键字:Bug 编译器 java
  • 更新时间 :
  • 英文 :


我可以问一下,在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对象,其中包含查询产生的数据;never null

调用resultSet.next()将"cursor"移动到下一行。看到javadoc:

将光标从当前位置向前移动一行。ResultSet游标最初定位在第一行之前;方法next的第一次调用使第一行成为当前行;第二个调用将第二行作为当前行,依此类推。

因此,如果您刚刚跳过了调试器中的executeQuery()调用,则resultSet位于第一行之前。

如果你要求调试器表达式求值(使用"Display"),调试器实际上将调用 next()方法,该方法将前进到第一行并返回true

当您随后遍历if语句时,它将再次调用next()方法,该方法将尝试前进到结果集的第二行。假设只返回一行,它将返回false,而跳过if块。

因此,通过在调试器中求值表达式,导致跳过唯一返回的行。

简而言之:注意在调试器中求值表达式的副作用。你不应该评估任何有副作用的东西。只计算幂等方法,例如getter, toString()

最新更新