java - 在 Java 中,您将如何编写可抛出异常的 Iterable 等价物?

标签 java exception

在 java 中,一个类可以实现 Iterable,它允许您使用 foreach() 语句和迭代语法糖:

for(T t:ts) ...

但是,这不允许您在构造 Iterator 时抛出异常。如果您正在迭代网络、文件、数据库等,那么能够抛出异常会很好。明显的候选者是 java.io.InputStream、Reader 和 java.nio.Channel 代码,但它们都不能像 Iterable 接口(interface)那样使用泛型。

是否有针对这种情况的通用习惯用法或 Java API?

澄清:这是在询问是否存在用于迭代非内存源对象的模式或替代接口(interface)。正如响应者所说,不推荐仅抛出 RuntimeExceptions 来解决问题,这也是我想要的。

编辑 2:感谢到目前为止的回答。共识似乎是“你不能”。那么我能否将问题扩展为“在这种情况下你会做什么,这种情况何时有用?”只写自己的界面?

最佳答案

不幸的是你不能。有两个问题:

  • Iterator API 没有声明要抛出的任何异常,因此您必须抛出 RuntimeExceptions(或非异常可抛出的异常)
  • 增强的 for 循环不会在循环结束时尝试释放资源

这很烦人。例如,在 C# 中,您可以真正轻松地编写代码来遍历文本文件的行:

public static IEnumerable<string> ReadLines(string filename)
{
    using (TextReader reader = File.OpenText(filename))
    {
        string line;
        while ( (line=reader.ReadLine()) != null)
        {
            yield return line;
        }
    }
}

用作:

foreach (string line in ReadLines("foo.txt"))

foreach 循环在 finally block 中调用 IEnumerator 上的 Dispose,这转化为“检查我们是否需要在迭代器 block 的 finally 中执行任何操作(来自使用陈述)”。显然 C# 中没有检查异常,所以这方面也不是问题。

因此,整个(有用的!)成语在 Java 中几乎行不通。

关于java - 在 Java 中,您将如何编写可抛出异常的 Iterable 等价物?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/456935/

相关文章:

java - 二叉搜索树 (BST) 中的多线程插入

android - Kotlin 调用 Java 平台类型导致 illegalStateException

javascript - 通过javascript设计的中间服务器探针调用java jar方法

java - 线程 "main"java.lang.NullPointerException 中的 logResponse 异常

haskell - 如何使用CallStack抛出异常?

java - 如何反转荣格树中的箭头位置?

java - 如何写入 CSV 文件的新行

Java - 具有不同对象类型的列表

java - 在java中重命名文件

c# - 为什么在 "try"或 "catch"或 "finally"的范围内声明的变量没有?