【问题标题】:Scala: Predicate does not hold ExceptionScala:谓词不持有异常
【发布时间】:2015-09-24 02:18:43
【问题描述】:

这个异常在 Scala 中意味着什么:

java.util.NoSuchElementException: Predicate does not hold for ...

【问题讨论】:

  • 它是用于理解吗?
  • 实际上,是的,它似乎确实发生在 for 理解中的一个语句中,从未出现在正文中。
  • 你能粘贴完整的错误和代码吗?

标签: scala for-loop


【解决方案1】:

导致这种情况的一种方法是,如果您有一个结合了 Try 和谓词的 for-comprehension(if 语句):

for {
  x <- Try(expr) if booleanExpr
} {
  ...
}

如果 booleanExpr 的计算结果为 false,Try 的 filter 方法可以抛出 java.util.NoSuchElementException 以跳过循环体。

该异常的reason 字段是“谓词不适用于...”

正如@Guillaume 在 cmets 中指出的那样,正是 Try 的实现通过实现 filter 的方式导致了这种情况——当您在 for comprehension 中使用条件 (if) 时编译器调用的方法:

if (p(value)) this
else Failure(new NoSuchElementException("Predicate does not hold for " + value))

【讨论】:

  • 请说明该信息的来源。据我所知,for 内部的if 被转译为withFilter。从未听说过抛出 NoSuchElementException 来跳过循环体。
  • @GuillaumeMassé,我明白了。 Brent 的回答让人误以为这与 for 理解有关,而这完全与 filterTry 有关。
  • @Aivean 谢谢。当我遇到这个错误时,我使用的是x &lt;- Try(expr),所以这就解释了。我会更新我的答案。
【解决方案2】:

特定于scala.util.Try

scala.util.Try(2).filter(_ < 0) // Failure(java.util.NoSuchElementException: Predicate does not hold for 2)



  for {
    v <- scala.util.Try(2)
    if v < 0
  } yield v // Failure(java.util.NoSuchElementException: 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    • 2019-12-06
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多