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
来处理错误,以便在出现错误时提供默认值。