我在java.util.Iterator中包装java.sql.RecordSet。我的问题是,如果任何记录集方法抛出SQLException,我该怎么办?
java.util.Iterator javadoc解释了在各种情况下抛出的异常(例如,如果你在最后一个元素之外调用next(),则为NoSuchElementException)
然而,它并未提及当由于例如由...引起的完全不相关的问题时该怎么做。网络或磁盘IO问题。
只能在next()和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");
}
}
答案 0 :(得分:11)
我会将已检查的异常包装在未经检查的异常中,允许在不破坏Iterator的情况下抛出它。
我建议一个特定于应用程序的异常扩展RuntimeException,实现构造函数(String,Throwable),这样你就可以保留对原因的访问权。
例如
@Override
public boolean hasNext() {
try {
return !rs.isAfterLast();
} catch (SQLException e) {
throw new MyApplicationException("There was an error", e);
}
}
更新:要开始寻找更多信息,请尝试Googling'check unchecked java sqlexception'。在'Best Practises for Exception Handling' on onjava.com上详细讨论已检查与未检查的异常处理以及IBM Developerworks上的一些不同方法的讨论。