如何在构造函数的try-catch

时间:2019-06-10 10:34:18

标签: kotlin constructor try-catch

我可以轻松地处理构造函数中的失败分配:

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
  }
}

5 个答案:

答案 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
}

这里numbertype是构造函数的局部变量,将被分配给bigDecimalbigDecimalType 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),那么捕获特定异常是个好主意。