迭代器实现应该如何处理检查异常?

2024-01-28

我将 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(使用前将#替换为@)

迭代器实现应该如何处理检查异常? 的相关文章

随机推荐