【问题标题】:kotlin unreachable code when using finally and enum使用finally和enum时kotlin无法访问的代码
【发布时间】:2016-11-21 09:16:34
【问题描述】:

我遇到过这样的问题,android studio 会警告我有关无法访问的代码。我不明白,它是如何无法访问的。

我的原始代码:

        try {
            return BasketProvider.valueOf(prefs.getString(KEY_BASKET_PROVIDER, null)) //unreachable code here
        } finally {
            return BasketProvider.LOCAL
        }

如果我最终更改为catch(e :IllegalArgumentException),则没有警告。如果我将它们全部组合起来,则会再次出现警告。

        try {
            return BasketProvider.valueOf(prefs.getString(KEY_BASKET_PROVIDER, null))//no warning
        } catch (e: IllegalArgumentException) {
            return BasketProvider.LOCAL
        }
        --------------------------------
        try {
            return BasketProvider.valueOf(prefs.getString(KEY_BASKET_PROVIDER, null))//unreachable code
        } catch (e: IllegalArgumentException) {
            return BasketProvider.LOCAL //unreachable code
        } finally {
            return BasketProvider.LOCAL
        }

这是 Kotlin 错误,还是我遗漏了什么?

编辑:

篮子提供者是简单的枚举类:

enum class BasketProvider {
    LOCAL, SHARED
}

【问题讨论】:

  • 你不应该从 finally 块返回。由于 finally 块总是在运行,所以 return 将取代 try 或 catch 块返回的内容,从而有效地使 try 或 catch 块中的 return 无法访问,并吞下方法抛出的异常。不要从 finally 块返回:这是不好的做法。 finally 块对于始终关闭资源或进行其他一些清理很有用。

标签: kotlin finally unreachable-code


【解决方案1】:

finally总是 执行(除非你在中间调用System.exit()),所以你在 finally 块中的返回值将总是覆盖你的 try/catch 返回值。另见:Does a finally block always run?

“无法访问的代码”在这里是误导,应该称为“返回值总是被finally块覆盖”。

【讨论】:

  • finally 在kotlin 中是not always executed,您可以在try 块中使用suspendCoroutineOrReturn,并在您的块中返回COROUTINE_SUSPENDED 作为返回值,从而在没有finally 的情况下执行try 块块,JB 团队说这是设计使然 github.com/Kotlin/kotlin-coroutines/blob/master/…
猜你喜欢
  • 2016-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-27
  • 1970-01-01
  • 2019-02-18
  • 2019-02-11
相关资源
最近更新 更多