【问题标题】:Scala try and catch ErrorScala 尝试捕获错误
【发布时间】:2015-06-19 17:53:12
【问题描述】:

这是我的代码:

def loadOperation(fileName:String): csvList = {
  try{
   val pattern = """^(.+);(\d{5});(4|2|31);(0|1);(.+);(\d+|\d+,\d+)$""".r
   Source.fromFile(fileName).getLines().foldLeft(List[CsvEntry]())((csvList, currentLine) =>
     currentLine match {
      case pattern(organisation,yearAndQuartal,medKF,trueOrFalse,name,money) => new CsvEntry(organisation,yearAndQuartal.toInt,medKF.toInt,trueOrFalse.toInt,name,money) :: csvList
      case default => csvList
      })
  } catch {
    case one: java.io.FileNotFoundException => println("This file could not be found!")
  }}

问题是我的代码不起作用,它总是显示以下错误:

发现类型不匹配:需要扩展为 List[CsvEntry] 的单元 csvList?

我该如何解决这个问题?

【问题讨论】:

  • cvsList的定义是什么?您将其作为函数返回类型,但在默认情况下您也将其用作值
  • ups 抱歉:"type csvList = CsvList[Entry]" "val list: csvList = List()"
  • 当您捕捉到FileNotFoundException 时,您使用println 打印出错误消息。因此类型将是Unit
  • 这没有意义,你将它用作一个值,作为 foldLeft 的参数和默认情况下表达式的返回值。范围内是否有一些实例也命名为 csvList?
  • 是的,我已经定义了一个空列表,然后我使用正则表达式从输入文件中捕获内容并将其添加到我的 csvList 中......所以我将 CsvEntries 添加到我的 csvList 中。问题出在哪里?

标签: scala try-catch


【解决方案1】:

问题在于catch 子句:

println("This file could not be found!")

具有Unit 类型,显然不是csvList。您应该添加一个返回空列表的附加行,例如

catch {
    case one: java.io.FileNotFoundException => println("This file could not be found!")
}

Nil

【讨论】:

  • 谢谢!是否也可以返回列表?但在这种情况下,我认为 Nil 是更好的解决方案!
  • 您是指来自foldLeft 的列表吗?如果发生 FNFE,它甚至不会到达 foldLeft 部分,所以 Nil 在这里很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-21
相关资源
最近更新 更多