我在 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()
}
}
}
我在 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()
}
}
}
Scala 试图避免未定义/空值。但是,您可以通过在try
失败时为案例提供返回值并a
使用整个try
表达式进行初始化来解决问题:
private val a: SomeClass =
try {
someThing // this statement may throw an exception
} catch {
case ex: Exception => {
ex.printStackTrace()
someDefault
}
}
更新:Try
在 Scala 中,使用from可能更惯用scala.util
:
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
从某些异常中恢复(并可能重用这些部分函数)。
由于在 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
检查任何使用该值的代码。