Scala错误-Unit类型的表达式不';不符合预期的类型文件

Scala错误-Unit类型的表达式不';不符合预期的类型文件,scala,exception-handling,Scala,Exception Handling,我有以下代码: var tempLastFileCreated: File = try { files(0) } catch { case e: ArrayIndexOutOfBoundsException => ??? } 其中files是val files:Array[File]=dir.listFiles() 现在,无论我在案例e中给出什么,我都会得到类型单位的表达式不符合预期类型文件的消息 我知道=>的右边部分必须是文件类型的东西 有人能告诉我放什么吗 您承诺创建的tem

我有以下代码:

var tempLastFileCreated: File = try {
  files(0)
} catch {
  case e: ArrayIndexOutOfBoundsException => ???
}
其中
files
val files:Array[File]=dir.listFiles()

现在,无论我在
案例e中给出什么,我都会得到类型单位的
表达式不符合预期类型文件的消息

我知道
=>
的右边部分必须是
文件类型的东西


有人能告诉我放什么吗

您承诺创建的
tempLastFileCreated
是一个
文件
,因此它不能同时是
单元
字符串
,等等。您有两个选项。您可以使用
选项[File]

val tempLastFileCreated: Option[File] = try {
      Some(files(0))
    }
    catch {
      case e: ArrayIndexOutOfBoundsException => None
    }
或者,如果您想存储错误消息,例如,另一个选项是使用

val tempLastFileCreated: Either[String, File] = try {
      Right(files(0))
    }
    catch {
      case e: ArrayIndexOutOfBoundsException => Left("index out of bounds!")
    }
什么最适合你的需要。您可能想看看Scala的
Scala.util.Try
数据类型,这样更安全。比如说,

val tempLastFileCreated: Option[File] = Try(files(0)) match {
  case Success(file) => Some(file)
  case Failure(throwable) => None //or whatever
}

您承诺创建的
tempLastFileCreated
是一个
文件
,因此它不能同时是
单元
字符串
,等等。您有两个选项。您可以使用
选项[File]

val tempLastFileCreated: Option[File] = try {
      Some(files(0))
    }
    catch {
      case e: ArrayIndexOutOfBoundsException => None
    }
或者,如果您想存储错误消息,例如,另一个选项是使用

val tempLastFileCreated: Either[String, File] = try {
      Right(files(0))
    }
    catch {
      case e: ArrayIndexOutOfBoundsException => Left("index out of bounds!")
    }
什么最适合你的需要。您可能想看看Scala的
Scala.util.Try
数据类型,这样更安全。比如说,

val tempLastFileCreated: Option[File] = Try(files(0)) match {
  case Success(file) => Some(file)
  case Failure(throwable) => None //or whatever
}

如何在
尝试
时使用
.toEither
.toOption
?这确实解决了问题,但在后面的部分中,我使用了
tempLastFileCreated.lastModified()
,无论我使用的是
选项[文件]
还是
选项[字符串,文件]
@rbh-93问题在于,您不再拥有
文件
,而是拥有
选项[File]
选项[String,File]
,这就像尝试对
字符串进行求和一样-它是不同的数据类型,有不同的方法。。。Try、Option和other等抽象背后的思想是强制方法调用方处理错误,有两种方法可以做到这一点,例如:使用任何类型的
getOrElse
检索给定默认值(如果该值丢失),使用模式匹配对值和错误执行不同的操作,或者在上面使用更高阶的函数,比如
map
。@LuisMiguelMejíaSuárez我现在理解了这个错误。对不起,如果我的问题听起来很愚蠢,但我对Scala很陌生。在执行
ArrayIndexOutOfBoundsException
异常处理的同时,是否可以保留
lastModified()
功能?@rbh-93没问题,我们都在学习一些东西(对不起,如果我听起来很刺耳,那不是我的本意——英语不是我的母语,我一直觉得我在英语中听起来很有侵略性)。关于你的问题,这取决于你对“错误处理”的理解,更具体地说,谁应该处理错误?可能创建的
tempLastFileCreated
应该始终是一个文件,因此您可能需要使用
try/catch
try
来处理那里的错误,以便在出现错误时提供默认值。如果
出现问题,则使用
尝试
上的
toEither
.toOption
来处理该错误确实解决了这个问题,但在后面的部分中,我使用了
tempLastFileCreated.lastModified()
,无论我使用的是
Option[File]
还是
或者[String,File]
@rbh-93,都会产生问题。问题是,您不再拥有
文件,而是拥有
选项[File]
或者
[字符串,文件]
这就像试图求一个
字符串的和-这是一种不同的数据类型,它有不同的方法…像Try,Option和other这样的抽象背后的想法是强迫方法的调用方处理错误,有两种方法可以做到这一点,比如:使用任何类型的
getOrElse
来检索给定错误的值t如果值丢失,使用模式匹配对值和错误执行不同的操作,或者对它们使用高阶函数,如
map
。@LuisMiguelMejíaSuárez我现在理解错误。如果我的问题听起来很愚蠢,很抱歉,但我对Scala很陌生。是否可以保留
lastModified()
功能同时实现
ArrayIndexOutOfBoundsException的异常处理
?@rbh-93没问题,我们都在学习一些东西(抱歉,如果我听起来很严厉,这不是我的本意-英语不是我的母语,我总是觉得我在这方面听起来很有侵略性)。关于您的问题,这取决于“错误处理”的含义,更具体地说,谁应该处理错误?可能
tempLastFileCreated
应该始终是一个文件,因此您可能需要使用
try/catch
try
来处理错误,以便在出现错误时提供默认值。