我可以轻松地处理构造函数中的失败分配:
val v: BigDecimal
constructor(s: String) {
v = try {
BigDecimal(s)
}
catch (e: Exception) {
BigDecimal.ZERO
}
}
但是,如果我需要填写两个变量,该如何处理?这不起作用:
constructor(s: String) {
(v, type) = try {
Pair(BigDecimal(s), RealTypes.Normal)
}
catch (e: Exception) {
Pair(BigDecimal.ZERO, RealTypes.NaN)
}
}
当然,Val只能分配一次,尽管我不确定构造函数是否会成为该规则的例外。但实际上,由于以下规则,这也不起作用:
constructor(value: String) {
v = try {
type = RealTypes.Normal
BigDecimal(value, context)
}
catch (e: Exception) {
type = RealTypes.NaN
BigDecimal.ZERO
}
}
答案 0 :(得分:1)
好吧,我发现这种方法有效,但是我不太喜欢。
constructor(s: String) {
val (v, type) = try {
Pair(BigDecimal(value), RealTypes.Normal)
}
catch (e: Exception) {
Pair(BigDecimal.ZERO, RealTypes.NaN)
}
this.v = v;
this.type = type;
}
答案 1 :(得分:1)
如何使用像这样的局部变量?
val bigDecimal: BigDecimal
val bigDecimalType: RealTypes
constructor (s: String) {
var number: BigDecimal
var type: TealTypes
try {
type = RealTypes.Normal
number = BigDecimal(s)
} catch (e: Exception) {
type = RealTypes.NaN
number = BigDecimal.ZERO
}
bigDecimal = number
bigDecimalType = type
}
这里number
和type
是构造函数的局部变量,将被分配给bigDecimal
和bigDecimalType
val。
答案 2 :(得分:1)
那呢?
constructor(s: String) {
val result = runCatching { BigDecimal(s) }
v = result.getOrDefault(BigDecimal.ZERO)
type = if (result.isSuccess) RealTypes.Normal else RealTypes.NaN
}
还是那个?
constructor(s: String) {
runCatching { BigDecimal(s) }.apply {
v = getOrDefault(BigDecimal.ZERO)
type = if (isSuccess) RealTypes.Normal else RealTypes.NaN
}
}
答案 3 :(得分:0)
在构造函数类中使用lateinit var代替Val。这是示例示例
class Myclass() {
lateinit var v: BigDecimal
constructor(s: String) : this() {
v = try {
BigDecimal(s)
} catch (e: Exception) {
BigDecimal.ZERO
}
}
fun print() {
println(v)
}
}
然后像这样打电话
Myclass("100").print() //output is 100
答案 4 :(得分:0)
您可以使用标志来了解是否引发了异常:
class Foo {
val a: BigDecimal
val b: RealTypes
constructor(s: String) {
var failed = false
a = try {
BigDecimal(s)
} catch (e: NumberFormatException) {
failed = true
BigDecimal.ONE
}
b = if(failed) RealTypes.NaN else RealTypes.Normal
}
}
这样,您可以先对异常使用表达式表示法,然后对满足约束val
只能初始化一次的if-else-block使用if-else-block。
注意:如果明确知道异常是什么(在这种情况下为NumberFormatException
),那么捕获特定异常是个好主意。