JavaNoSuchElementException
是否有 C# 等价物?
3 回答
.NET 通常InvalidOperationException
用于此目的。无论如何,您不应该捕获NoSuchElementException
,因为它通常表示程序错误。因此,在这个用例中,具体的异常类型并不重要。
不幸的是,InvalidOperationException
在许多地方用于许多不同的事情。你常常不能从中看出什么。这是 BCL 异常层次结构中的一个缺陷。
在 Java 中,NoSuchElementException
用于指示已到达枚举的结尾:
nextElement
由an 的方法抛出,Enumeration
表示枚举中没有更多元素。
.NET Framework 使用不同的接口,当到达枚举的末尾时,将在 whereIEnumerator.MoveNext
中返回false
,而不是抛出异常:
如果
MoveNext
通过了集合的末尾,则枚举器定位在集合中的最后一个元素之后并MoveNext
返回false
。当枚举数位于此位置时,后续调用MoveNext
也返回false
。
编辑:Rawling 正确地指出,如果Current
在集合结束之后访问该属性,则可能仍然会出现问题。在这种情况下,行为并不一致。IEnumerator.Current
声明将抛出异常;但是,List<T>.Enumerator.Current
声明该行为未定义:
为了获得更好的性能,如果枚举数位于第一个元素之前或最后一个元素之后,此属性不会引发异常。该属性的值未定义。
编辑2:似乎没有等效的例外。在 .NET 中,您不能忽略枚举器的状态(例如,通过MoveNext
方法的返回值标识),否则您将遇到未定义的行为,这可能会意外地破坏您的应用程序。
Linq 使用:
[InvalidOperationException]
随着消息:
Sequence contains no elements