我将 java.sql.RecordSet 包装在 java.util.Iterator 中。我的问题是,如果任何记录集方法抛出 SQLException,我该怎么办?
The java.util.Iterator javadoc http://java.sun.com/j2se/1.4.2/docs/api/java/util/Iterator.html解释在各种情况下抛出哪些异常(即,如果您在最后一个元素之外调用 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");
}
}
我将检查的异常包装在未检查的异常中,允许在不破坏迭代器的情况下抛出它。
我建议使用特定于应用程序的异常来扩展 RuntimeException,实现构造函数(String、Throwable),以便您可以保留对原因的访问。
eg.
@Override
public boolean hasNext() {
try {
return !rs.isAfterLast();
} catch (SQLException e) {
throw new MyApplicationException("There was an error", e);
}
}
更新:要开始寻找更多信息,请尝试谷歌搜索“checked unchecked java sqlexception”。关于检查与非检查异常处理的相当详细的讨论onjava.com 上的“异常处理最佳实践” http://onjava.com/pub/a/onjava/2003/11/19/exceptions.html并讨论了一些不同的方法IBM 开发者工作室 http://www.ibm.com/developerworks/java/library/j-jtp05254.html.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)