【问题标题】:Predicate implementation inquiry FilreredRowSet in JAVAJAVA中谓词实现查询FilreredRowSet
【发布时间】:2013-09-24 13:53:51
【问题描述】:

我有以下谓词实现:

public boolean evaluate(RowSet rowset )
    {try{
        int count=0;
        CachedRowSet crs = (CachedRowSet)rowset;

        {
                if (!crs.isAfterLast())//CRUCIAL LINE

            for (int i=0;i<index.length;i++)
            {
                if ((crs.getObject(index[i])).toString().compareTo(high[i].toString())<=0)
                {
                    if ((crs.getObject(index[i])).toString().compareTo(low[i].toString())>=0)
                    {
                        count++;
                    }
                }

            }
        }

现在,如果我因此注释掉“关键线”:

            if (!crs.isAfterLast())

我会收到java.sql.SQLException: Invalid cursor position。 为什么会这样?如果下一行是 afterLast,它不会使用 .next() 方法返回 false 吗?

我可以遍历任何结果集而无需检查if (!crs.isAfterLast())。只需使用 rs.next() 就足够了,因为如果 next 在最后一个之后,它会返回 false。

为什么在谓词中不会发生这种情况?提前致谢。

【问题讨论】:

    标签: java jdbc predicate rowset


    【解决方案1】:

    您遇到的问题是 Java 7 中的一个错误(甚至在 7.0_45 中),记录在此:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7166598

    避免对我有用的“无效游标位置”SQLException 的简单解决方法是将此逻辑添加到 Predicate.evaluate(RowSet rs) 实现的开头,以检测行集结束条件:

        FilteredRowSet frs = (FilteredRowSet) rs;
        int rowNum = frs.getRow();
        if (rowNum == 0) { // Meaning "no current row" - should never happen... 
            return false; // Needed only to address a bug in Java 7
        }
    

    您调用 isAfterLast() 的解决方法似乎也很好,简单地吞下 SQLException 的丑陋解决方法也有效,因为在所有处理完成后发生异常。

    问题在Java 8 RTE下已修复,无需重新编译。

    我专门测试了一个 Predicate 实现,该实现在 Java 7 下使用 Java 8、Intellij Idea 以及命令行都失败了。在 Java 8 下,它也可以正常工作,无需上述 Java 7 解决方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-26
      • 2010-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多