2010-02-27 33 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