2010-02-27 48 views
8

我在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"); 
    } 
} 

回答

11

我想包的檢查異常在未經檢查的異常,允許其在不破壞迭代器拋出。

我會建議一個應用程序特定的異常擴展RuntimeException,實現構造函數(字符串,Throwable),以便您可以保留訪問的原因。

例如。

@Override 
    public boolean hasNext() { 
     try { 
     return !rs.isAfterLast(); 
     } catch (SQLException e) { 
     throw new MyApplicationException("There was an error", e); 
     } 
    } 

更新:要開始尋找更多的信息,谷歌搜索試試 '檢查未檢查的java的SQLException'。詳細討論'Best Practises for Exception Handling' on onjava.com上的檢查與未檢查異常處理以及IBM Developerworks上的一些不同方法的討論。

+0

好主意。你推薦哪個例外?有沒有一個公認的做法呢? – amarillion 2010-02-27 10:26:06

+1

希望有所幫助 - 如果您覺得它適合,可以使用現有的RuntimeException子類,如IllegalStateException,如果您想要進一步處理它並使異常在您的應用程序的上下文中有意義,我懷疑您希望創建自己的異常子類。 – Brabster 2010-02-27 10:34:56

+0

如果代碼包含許多迭代器,則可能會終止檢查異常。這個Java角落似乎被設計打破了。 – ceving 2013-06-25 11:08:37