【问题标题】:Why poor casting causes ActivityNotFound Exception in Android using Kotlin?为什么在使用 Kotlin 的 Android 中糟糕的转换会导致 ActivityNotFound 异常?
【发布时间】:2018-03-14 11:18:36
【问题描述】:

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

这是我的活动代码:

 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 变量转换为安全转换,一切似乎都没有错误,一切都开始完美运行。例如:

 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. 为什么使用安全转换运算符解决了问题,因为即使没有安全转换运算符,我的转换也是正确的?

【问题讨论】:

  • @user2340612 这就是问题所在,我只得到的异常是 ActivityNotFound 异常,这真的没有意义。附言感谢您解决我的第二个问题。
  • 也许ActivityNotFound 可能是因为ClassCastException 被抛出在Activity 的onCreate 中,因此创建没有成功并且运行时找不到Activity。但这只是我的猜测,我可能错了
  • 这看起来更像是一个空指针异常而不是类转换异常......我可能错了。
  • OP 说使用安全强制转换解决了这个问题,NPE 不应该是这种情况。此外,使用安全调用运算符 (?.) 和 elvis 运算符,null 值可以“安全”处理(除非 NPE 发生在其他地方)

标签: android kotlin activitynotfoundexception


【解决方案1】:

在运行时你应该得到一个ClassCastException,如果问题是关于错误的转换(顺便说一下,抛出异常的不是编译器,而是运行时。编译器/LINT 应该警告你“未经检查的转换” ”,不过)。

关于您的第二个问题,安全转换将返回null,以防转换不成功,这使您陷入 elvis 运算符的“else”分支(?:),因此您将创建一个新的空HashMap&lt;Int, Boolean&gt; 并将其分配给您的 mCheatMap 变量。这在您的第一个示例中不会发生,因为失败的强制转换引发异常而不是简单地返回 null,因此永远无法执行 elvis 运算符的“else”分支(您应该得到编译器/LINT 的另一个警告这个)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-14
    • 2012-10-29
    • 2010-09-18
    • 2020-12-11
    • 2013-07-06
    • 1970-01-01
    相关资源
    最近更新 更多