【问题标题】:Exception is thrown, although I have catch clause for that抛出异常,尽管我有 catch 子句
【发布时间】:2018-07-18 04:40:11
【问题描述】:

我有这个代码:

fun String?.toDoubleOrZero(): Double
{
    if (null == this) return 0.0
    return try { this.toDouble() }     // <-- Line #67
    catch (e: NumberFormatException) { 0.0 }
    catch (e: java.lang.NumberFormatException) { 0.0 }  //Just to make sure
}

我已经明确处理了NumberFormatException。我什至添加了 Java 的NumberFormatException 以确保。但是我仍然有很多这样的崩溃报告:

Fatal Exception: java.lang.NumberFormatException: Invalid double: "35°45'39.2"N"
       at java.lang.StringToReal.invalidReal(StringToReal.java:63)
       at java.lang.StringToReal.parseName(StringToReal.java:230)
       at java.lang.StringToReal.parseDouble(StringToReal.java:254)
       at java.lang.Double.parseDouble(Double.java:295)
       at *********.toDoubleOrZero(***.kt:67)
       at ...

这怎么可能?我需要做什么?

注意:我什至无法重现这种情况,我的代码在测试时可以正常工作,但是我在 Crashlytics 中有很多这样的崩溃报告。

编辑:我发现这只发生在装有 Android 4 的 HTC 设备上!

【问题讨论】:

  • "注意:我什至无法重现这种情况,我的代码在测试时可以正常工作,但是我在 Crashlytics 中有很多这样的崩溃报告。"你确定它们来自同一个版本吗?
  • @AlexeyRomanov 是的,它发生在我的应用程序的所有版本上,但我只是注意到它只发生在 Android 4 和 HTC 设备上!

标签: android exception-handling kotlin


【解决方案1】:
  1. 在 Kotlin 中,NumberFormatExceptiontypealias 对应于 java.lang.NumberFormatException,因此您不需要第二个。
  2. 既然您已经拥有toDoubleOrNull(),为什么还要处理异常?

    fun String?.toDoubleOrZero(): Double { val result = this?.toDoubleOrNull() return if (result == null) 0.0 else result }

  3. 我不相信你的代码是异常的原因,所以把上面的代码测试一下,看看有没有异常。

【讨论】:

  • 更好:fun String?.toDoubleOrZero(): Double = this?.toDoubleOrNull() ?: 0.0.
  • @AlexeyRomanov 当然是这样,但我更喜欢在我提供代码以使其被尽可能多的人阅读时,并且 Kotlin 仍然可供少数人使用。
  • 很好,这是解决这个问题的好方法:) 找出异常是如何从 catch 子句中逃脱的仍然让我很烦恼。
【解决方案2】:
fun String?.toDoubleOrZero(): Double
{
   double value;
     if (null == this) {
        return 0.0 
     }
     return try {
      value = new Double(this.toString()); //typecast your value which is in **this** into double

                 **OR**

    value = Double.valueOf(this); //if **this** is String type;
    }     // <-- Line #67
    catch (e: NumberFormatException) {
      value = 0;
    }
    catch (e: java.lang.NumberFormatException) {
      value = 0;
    } 
}

【讨论】:

  • Double 类(在 kotlin 中)既没有采用 String 的构造函数,也没有静态方法 valueOf
  • 使用 public inline fun String.toDouble(): Double = java.lang.Double.parseDouble(this).
猜你喜欢
  • 1970-01-01
  • 2021-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多