这是java.sql.ResultSet.next()
:
public boolean next() throws SQLException
众所周知,如果ResultSet
中有更多行可用,则该方法返回true。
但是如果抛出SQLException
怎么办?我无法获得next()
的返回值,因此我无法知道是否有更多记录可用(界面中没有hasNext
方法的痕迹)。
让我们切换视角。我正在研究需要容错的JDBC驱动程序(它从csv读取)。如果在错误的行之后有更多行可用,我如何让我的用户知道?
答案 0 :(得分:2)
API设计没有错。
next()
- 将光标从当前位置向前移动一行。因此JDBC驱动程序只有结果集的游标。每次调用next()方法时,它都会通过该游标从数据库中获取每一行。在查询表格时处理大量行的方案中遇到一些“异常”是合乎逻辑的。
由于您正在“设计”自己的基于csv的驱动程序,您可以随意更改next()
API的行为。虽然签名声明它可能会抛出SQLException
,但您可以编写next
方法的实现,以便它返回一个空的或部分填充的对象,以使其具有容错能力。
有一些过时的技术可以找到ResultSet中的记录总数 - 例如
调用last()
,然后在开始迭代之前调用ResultSet::getRow()
来查找记录数。
答案 1 :(得分:1)
由您来决定您的实现是否实际上从这些方法中抛出异常,只是因为它在接口上并不会强迫您抛出它。但如果出现问题,你的司机无法确定是否有下一行,我怀疑它是否可以恢复。我的意思是,如果您的底层代码由于某种原因(网络访问,权限,硬件故障,其他一些进程从您下面删除了文件)而抛出IOException,抛出异常可能是合理的事情。
答案 2 :(得分:0)
您可以使用isLast()
来确定您是否在最后一行。但是,这也会引发SQLException
。
答案 3 :(得分:0)
虽然大多数人都同意JDBC被各种(checked!)异常污染,异常的意思是“抱歉,我不知道,这个错误发生了”,这就是为什么它在异常发生时不返回值的原因提高。这种情况是“我失去联系”,或者发生了更糟糕的事情。
如果您知道在该行之后有一行,则返回true。
如果下一行是格式错误的行,则在获取格式错误的行时抛出异常,即使您在执行“next()”方法期间能够检测到它也是如此。
答案 4 :(得分:0)
SQLException
。 (参见ResulSet的Javadoc)
在这两种情况下,您都不想继续使用结果集。如果发生异常,您可能希望尝试关闭它,然后将其丢弃。
我在这里看不到问题:你要不是下一行。当问题发生时,抛出异常。
如果你想在这里找到从Exceptions中恢复的东西,那么构建一些围绕而不是试图“破坏”这些界面的常见行为。
但也许您应该考虑不首先实现用于读取CSV数据的JDBC驱动程序。