gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 19:36:28 28 4
gpt4 key购买 nike

在 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com