在我们最近的应用程序发布中,我们看到有一些kotlin.NoWhenBranchMatchedException
被报告给了Fabric/Crashlytics。
这是相关的代码片段:
private lateinit var welcome: Welcome
// ...
welcome.welcomeStateLoginStatus.let {
val handled = when (it) {
UnknownUser -> {
btn_login.visibility = View.VISIBLE
btn_logout.visibility = View.GONE
secondButtonFocusedInfoText = getString(R.string.welcome_login_button_info)
tv_user_description.text = null
}
is InternalUser -> {
btn_login.visibility = View.GONE
btn_logout.visibility = View.VISIBLE
secondButtonFocusedInfoText = "Logout"
tv_user_description.text = "Logged in as internal user"
}
ExternalUser -> {
btn_login.visibility = View.GONE
btn_logout.visibility = View.VISIBLE
secondButtonFocusedInfoText = "Logout"
tv_user_description.text = "Logged in as external user"
}
}
}
并且类的定义:
data class Welcome(val welcomeStateLoginStatus: WelcomeStateLoginStatus, val userCanBuySubscription: UserCanBuySubscription? = null) : WelcomeState()
sealed class WelcomeStateLoginStatus() : Serializable
object UnknownUser : WelcomeStateLoginStatus()
data class InternalUser(var user: User) : WelcomeStateLoginStatus()
object ExternalUser : WelcomeStateLoginStatus()
我对于这段代码如何在理论上抛出那个异常感到困惑 - 您可以看到,我们甚至引入了handled
变量以强制编译器确保所有情况都被处理...
UnknownUser
和ExternalUser
前面不需要加is
吗? - Hong Duan: Serializable
,而没有serialVersionUID
。每个子类都有一个不同的serialVersionUID
。 - Lionel Briandis
检查而不是相等性检查来解决object
的问题? - david.mihola