Запрос о реализации предиката 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, описанного выше.