我在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