2013-09-19 3 views
0

У меня есть следующий предикат реализации:Predicate запрос реализация 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, если следующий после последнего.

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

ответ

1

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

Простое решение, чтобы избежать «Invalid позиции курсора» 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.