抛出IOException迭代

时间:2018-05-11 17:41:32

标签: java collections

我有一个LevelDBIterator,我必须在我自己的Java类中包装,它也实现了Iterator并在其中使用了LevelDBIterator。我有2个问题: 1. LevelDB执行文件读取,因此从文件系统读取的方法可以抛出IOException,如何在我的fnAfterEnter方法中抛出它?原因我问这是因为实施next()不会让我抛出任何异常 2.另外,如何关闭底层的LevelDBIterator以及何时?

Iterator

2 个答案:

答案 0 :(得分:0)

如果要实现需要在迭代结束时关闭资源的Iterator,则应将其封装在实现IterableAutoCloseable的对象中。

E.g。如果你通常会这样做:

for (MyObj obj : xxx.getSomeResource()) {
    // code here
}

然后更改代码,以便您执行此操作:

try (MyResource res = xxx.getSomeResource()) {
    for (MyObj obj : res) {
        // code here
    }
}

MyResource的位置如下:

class MyResource implements AutoCloseable, Iterable<MyObj> {
    private final LevelDBIterator levelDBIterator;
    public MyResource(LevelDBIterator levelDBIterator) {
        this.levelDBIterator = levelDBIterator;
    }
    @Override
    public Iterator<MyObj> iterator() {
        return /*code here*/;
    }
    @Override
    public void close() throws Exception {
        this.levelDBIterator.close();
    }
}

答案 1 :(得分:0)

问:如何在我的next()方法中抛出它?

答:您可以捕获异常,然后抛出未经检查的RuntimeException

问:如何关闭底层的LevelDBIterator以及什么时候?

答:除了实现Iterator之外,还要实现AutoCloseable,并记录您的迭代器必须在使用后关闭。 然后,迭代器的用户可以显式关闭它,或使用try-with-resources