我在Scala中有这个代码,a
对象应该是值而不是变量,如何初始化try块中的a
对象?
object SomeObject {
private val a : SomeClass
try {
a=someThing // this statement may throw an exception
}
catch {
case ex: Exception=> {
ex.printStackTrace()
}
}
}
答案 0 :(得分:21)
Scala尝试避免未定义/ null值。但是,如果try
失败并使用整个a
表达式初始化try
,则可以通过为案例提供返回值来解决问题:
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
使用部分函数从某些异常中恢复(并可能重用这些部分函数)。
答案 1 :(得分:3)
因为在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
检查。