0

我有以下谓词实现:

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,它不会使用返回 false 的 .next() 方法吗?

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

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

4

1 回答 1

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 解决方法。

于 2013-11-16T07:11:16.437 回答