为什么糟糕的强制转换导致Android使用Kotlin的ActivityNotFound Exception?

时间:2018-03-14 11:18:36

标签: android kotlin activitynotfoundexception

我最近在编写程序时遇到异常,我花了很多时间进行调试,因为编译器给出了错误的异常。

这是我的活动代码:

 private var mCheatMap = HashMap<Int, Boolean>()

 override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_quiz)

    mCheatMap = savedInstanceState?.getSerializable(KEY_CHEATER) as HashMap<Int, Boolean> ?: HashMap<Int, Boolean>()
}

在运行期间,我的应用程序崩溃了,当我查看日志时,它说ActivityNotFound异常并且在建议中,它说我可能没有在AndroidManifest.xml

中声明活动

突然间,我偶然地将mCheapMap变量投射到一个安全的演员阵容中,一切都开始完美地发挥作用,一切似乎都没有错误。 e.g:

 private var mCheatMap = HashMap<Int, Boolean>()

 override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_quiz)

    mCheatMap = savedInstanceState?.getSerializable(KEY_CHEATER) as? HashMap<Int, Boolean> ?: HashMap<Int, Boolean>()
}

现在我有一些困惑:

  1. 为什么编译器在发生投射问题时给了ActivityNotFound例外?

  2. 为什么使用安全施法操作员解决了这个问题,因为即使没有安全施法操作员,我的施法也是正确的?

1 个答案:

答案 0 :(得分:0)

在运行时你应该得到一个ClassCastException,如果问题是关于错误的转换(顺便说一下它不是抛出异常的编译器,而是运行时。编译器/ LINT应警告你一个“虽然没有检查演员表。

关于你的第二个问题,如果演员阵容失败,安全演员会返回null,这会让你落入猫王操作员的“else”分支(?:),所以你会创建一个新的空HashMap<Int, Boolean>并将其分配给您的mCheatMap变量。这不会发生在你的第一个例子中,因为失败的强制转换会抛出异常而不是简单地返回null,因此elvis运算符的“else”分支永远不会被执行(你应该得到编译器的另一个警告/ LINT for this)。