我有以下谓词实现:
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++;
}
}
}
}
现在,如果我评论出关键线&#34;因此:
if (!crs.isAfterLast())
我会得到java.sql.SQLException: Invalid cursor position
。
为什么会这样?如果下一行是afterLast?
我可以遍历任何结果集而无需检查if (!crs.isAfterLast())
。只使用rs.next()就足够了,因为如果next是在最后一个之后它返回false。
为什么在谓词中这不会发生?提前谢谢。
答案 0 :(得分: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解决方法。