Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVA中查询FilreredRowSet的谓词实现_Java_Jdbc_Predicate_Rowset - Fatal编程技术网

JAVA中查询FilreredRowSet的谓词实现

JAVA中查询FilreredRowSet的谓词实现,java,jdbc,predicate,rowset,Java,Jdbc,Predicate,Rowset,我有以下谓词实现: 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++)

我有以下谓词实现:

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++;
                    }
                }

            }
        }
我将得到一个
java.sql.SQLException:无效的光标位置
。 为什么会这样?如果下一行是afterLast,那么.next()方法是否会返回false

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


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

您遇到的问题是Java 7(甚至在7.0_45中)中的一个错误,记录如下:

避免对我有效的“无效光标位置”SQLException的一个简单解决方法是将此逻辑添加到Predicate.evaluate(行集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的方法也很有效,因为异常发生在所有处理完成之后

该问题在Java8RTE下已修复,无需重新编译

我特别测试了一个谓词实现,它在IntellijIDEA中使用Java8在Java7下失败,也在命令行中失败。在Java8下,它也可以正常工作,而不需要上述Java7解决方案

    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
    }