我最近在编写程序时遇到异常,我花了很多时间进行调试,因为编译器给出了错误的异常。
这是我的活动代码:
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>()
}
现在我有一些困惑:
为什么编译器在发生投射问题时给了ActivityNotFound
例外?
为什么使用安全施法操作员解决了这个问题,因为即使没有安全施法操作员,我的施法也是正确的?
答案 0 :(得分:0)
在运行时你应该得到一个ClassCastException
,如果问题是关于错误的转换(顺便说一下它不是抛出异常的编译器,而是运行时。编译器/ LINT应警告你一个“虽然没有检查演员表。
关于你的第二个问题,如果演员阵容失败,安全演员会返回null
,这会让你落入猫王操作员的“else”分支(?:
),所以你会创建一个新的空HashMap<Int, Boolean>
并将其分配给您的mCheatMap
变量。这不会发生在你的第一个例子中,因为失败的强制转换会抛出异常而不是简单地返回null
,因此elvis运算符的“else”分支永远不会被执行(你应该得到编译器的另一个警告/ LINT for this)。