【问题标题】:How should Iterator implementation deal with checked exceptions?Iterator 实现应该如何处理已检查的异常?
【发布时间】:2011-01-21 18:19:56
【问题描述】:

我将 java.sql.RecordSet 包装在 java.util.Iterator 中。我的问题是,如果任何记录集方法抛出 SQLException,我该怎么办?

java.util.Iterator javadoc 解释了在各种情况下要抛出哪些异常(即 NoSuchElementException 以防您在最后一个元素之外调用 next())

但是,它没有提到当出现完全不相关的问题时该怎么做,例如网络或磁盘 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");
    }
}

【问题讨论】:

    标签: java exception-handling iterator recordset


    【解决方案1】:

    我会将已检查的异常包装在未检查的异常中,允许在不破坏迭代器的情况下抛出它。

    我建议使用特定于应用程序的异常来扩展 RuntimeException,实现构造函数 (String, 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 上讨论了一些不同的方法。

    【讨论】:

    • 好主意。您推荐哪个例外?这有公认的做法吗?
    • 希望有所帮助 - 如果您觉得合适,您可以使用现有的 RuntimeException 子类,如 IllegalStateException,我怀疑如果您想进一步处理它并产生异常,您会想要创建自己的异常子类在您的应用程序上下文中有意义。
    • 如果代码包含许多迭代器,这可能会以消除检查异常而告终。这个 Java 角落似乎被设计打破了。
    猜你喜欢
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    相关资源
    最近更新 更多