我在Scala中有这段代码,a
对象应该是值而不是变量,我如何在a
块中初始化try对象?
object SomeObject {
private val a : SomeClass
try {
a=someThing // this statement may throw an exception
}
catch {
case ex: Exception=> {
ex.printStackTrace()
}
}
}
发布于 2013-07-07 16:32:21
Scala试图避免未定义/空值。但是,您可以通过为try
失败的情况提供返回值并使用整个try
表达式初始化a
来解决此问题:
private val a: SomeClass =
try {
someThing // this statement may throw an exception
} catch {
case ex: Exception => {
ex.printStackTrace()
someDefault
}
}
Scala:在中,从scala.util
中使用Try
可能更惯用
val x : Int =
Try({
someThing
}).recoverWith({
// Just log the exception and keep it as a failure.
case (ex: Throwable) => ex.printStackTrace; Failure(ex);
}).getOrElse(1);
Try
允许您以各种方式编写可能会因异常而失败的计算。例如,如果有两个Try
类型的计算,则可以调用
thing1.orElse(thing2).getOrElse(someDefault)
这将运行thing1
并在成功时返回其结果。如果失败,它将继续使用thing2
。如果也失败,则返回someDefault
。您还可以使用recover
或recoverWith
从使用部分函数的某些异常中恢复(并有可能重用这些部分函数)。
发布于 2013-07-07 16:31:29
因为在Scala中,块有返回值,并且最后一个表达式是默认的返回值,所以您可以这样做:
object SomeObject {
private val a : SomeClass = { //this additional block not necessary, but added for clarity
try {
someThing // this statement may throw an exception
}
catch {
case ex: Exception=> {
ex.printStackTrace()
null
}
}
}
}
。然而,我必须补充的是,这看起来像是你试图完成的事情,可能会在以后爆炸-你将需要在任何使用该值的代码中进行null
检查。
https://stackoverflow.com/questions/17513865
复制相似问题