使用 finally 和 enum 时 kotlin 无法访问代码
kotlin unreachable code when using finally and enum
我遇到过这样的问题,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 错误,还是我遗漏了什么?
编辑:
购物篮提供者是简单的枚举 class:
enum class BasketProvider {
LOCAL, SHARED
}
finally
块 always 执行(除非你在中间调用 System.exit()
),所以你的 finally 块中的 return 值将始终覆盖您的 try/catch return 值。另见:Does a finally block always run?
"Unreachable code"这里是误导,应该叫"return value is always overwritten by finally block".
我遇到过这样的问题,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 错误,还是我遗漏了什么?
编辑:
购物篮提供者是简单的枚举 class:
enum class BasketProvider {
LOCAL, SHARED
}
finally
块 always 执行(除非你在中间调用 System.exit()
),所以你的 finally 块中的 return 值将始终覆盖您的 try/catch return 值。另见:Does a finally block always run?
"Unreachable code"这里是误导,应该叫"return value is always overwritten by finally block".