如果在调用函数时抛出异常,如何继续处理?

时间:2014-02-04 11:25:51

标签: scala

此函数计算列表中指定位置的单词数,并输出一个Map,其中包含单词以及列表中提到该单词的次数:

  def getTopLinks(data: List[String], positionOfElementToCount: Int) = {

    val words = data.map(d => d.split(",")(positionOfElementToCount).trim)
    val wordCount: Map[String, Int] = words.foldLeft(Map.empty[String, Int]) { (m, x) => m + ((x,    m.getOrElse(x, 0) + 1)) }
    val sortedWordCount = wordCount.toList.sortBy { _._2 }.reverse

    sortedWordCount

  }

此方法抛出java.lang.ArrayIndexOutOfBoundsException。但是如何在上面的函数中忽略这个异常。如果为List中的元素抛出异常,则忽略它并继续。我不认为我可以包围一个try catch周围的行val words = data.map(d => d.split(“,”)(positionOfElementToCount).trim)因为那时我无法继续处理因为抛出了异常在这个陈述的某个地方。

如果这个过程在for循环中发生,那么我可以在一个违规的行周围包裹一个try catch并继续,但我认为在这种情况下我不能这样做吗?

3 个答案:

答案 0 :(得分:3)

试试这个:

val words = data.map(d => d.split(",").drop(positionOfElementToCount).headOption)

返回所需索引上的元素选项,如果索引大于数组大小,则不会抛出异常

答案 1 :(得分:1)

应该用这个:

val words = data.flatMap { d =>
      val split = d.split(",")
      if (split.isDefinedAt(positionOfElementToCount))
        Some(split(positionOfElementToCount))
      else None
    }

一个更简单的完整版本(包括更简洁的@serejja代码)将是:

def getTopLinks(data: List[String], positionOfElementToCount: Int) = {
    val words = data.flatMap { d => d.split(",").drop(positionOfElementToCount).headOption }
    words.view.groupBy(x => x).map(x => (x._1 -> x._2.size)).toList
}   

答案 2 :(得分:1)

试试这个:

val words = data.flatMap(d => d.split(",").slice(index, index+1).headOption)