我在java.util.Iterator中封装了一个java.sql.RecordSet。我的问题是,如果任何记录集方法抛出SQLException,我该怎么办?迭代器实现应如何处理已检查的异常?
的java.util.Iterator javadoc解释了在各种情况下抛出什么样的异常(即NoSuchElementException异常的情况下,调用next()超出了最后一个元素)
但是,它没有提到当有一个完全不相关的问题该怎么办由...引起的网络或磁盘IO问题。
仅在下一个()和hasNext()中引入SQLException是不可能的,因为它与Iterator接口不兼容。
这里是我当前的代码(简化):
public class MyRecordIterator implements Iterator<Record>
{
private final ResultSet rs;
public MyRecordIterator() throws SQLException
{
rs = getConnection().createStatement().executeQuery(
"SELECT * FROM table");
}
@Override
public boolean hasNext()
{
try
{
return !rs.isAfterLast();
}
catch (SQLException e)
{
// ignore, hasNext() can't throw SQLException
}
}
@Override
public Record next()
{
try
{
if (rs.isAfterLast()) throw new NoSuchElementException();
rs.next();
Record result = new Record (rs.getString("column 1"), rs.getString("column 2")));
return result;
}
catch (SQLException e)
{
// ignore, next() can't throw SQLException
}
}
@Override
public void remove()
{
throw new UnsupportedOperationException("Iterator is read-only");
}
}
好主意。你推荐哪个例外?有没有一个公认的做法呢? – amarillion 2010-02-27 10:26:06
希望有所帮助 - 如果您觉得它适合,可以使用现有的RuntimeException子类,如IllegalStateException,如果您想要进一步处理它并使异常在您的应用程序的上下文中有意义,我怀疑您希望创建自己的异常子类。 – Brabster 2010-02-27 10:34:56
如果代码包含许多迭代器,则可能会终止检查异常。这个Java角落似乎被设计打破了。 – ceving 2013-06-25 11:08:37