Запрос о реализации предиката FilreredRowSet в JAVA

У меня есть следующая реализация предиката:

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, Почему так происходит? Разве не используется метод.next(), возвращающий false, если следующая строка - afterLast?

Я могу проследить любой результат без необходимости проверять if (!crs.isAfterLast()), Достаточно просто использовать rs.next(), так как он возвращает false, если next идет после последнего.

Почему в предикате этого не происходит? Заранее спасибо.

1 ответ

Решение

Проблема, с которой вы сталкиваетесь, - это ошибка в Java 7 (даже в 7.0_45), описанная здесь: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7166598

Простой обходной путь, позволяющий избежать исключения SQLEx "Неверная позиция курсора", который сработал для меня, состоит в том, чтобы добавить эту логику к началу реализации 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, описанного выше.

Другие вопросы по тегам