尽管有安全措施,我的Kotlin代码中的NullPointerException仍然存在
下面的代码段来自我的onOptionsItemSelected函数。如果软键盘正在显示或调用活动的finish函数,则假设下面的第2-5行隐藏软键盘 我从一个关于堆栈溢出的“如何隐藏软键盘”的答案中得到了这段代码。它在我的手机上运行得很好,但当我最近在playstore上提交我的应用进行内部测试时,我发现它有时会抛出NPE。有人能解释一下为什么会发生这种情况吗尽管有安全措施,我的Kotlin代码中的NullPointerException仍然存在,kotlin,android-softkeyboard,inputmethodmanager,Kotlin,Android Softkeyboard,Inputmethodmanager,下面的代码段来自我的onOptionsItemSelected函数。如果软键盘正在显示或调用活动的finish函数,则假设下面的第2-5行隐藏软键盘 我从一个关于堆栈溢出的“如何隐藏软键盘”的答案中得到了这段代码。它在我的手机上运行得很好,但当我最近在playstore上提交我的应用进行内部测试时,我发现它有时会抛出NPE。有人能解释一下为什么会发生这种情况吗 R.id.done -> { val view:View? = this.currentFocus!! // throws
R.id.done -> {
val view:View? = this.currentFocus!! // throws null pointer exception
val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
if (bool && view!=null) {
imm.hideSoftInputFromWindow(view.windowToken, 0)
} else{
finish()
}
return true
你确定你清楚地理解了
代码>操作员工作?如果this.currentFocus
为null,则表示它应引发nullpointerexception:
卸下代码>,它应该工作得更好。
运算符被称为非空断言运算符——如果currentFocus
为空,则将抛出NPE。由于您的视图
可以是null
,因此可以安全地删除代码>操作员
阅读:
代码的要点
运算符将可为null类型的值转换为不可为null的等效值,同时积极确保该值确实不为null(否则将抛出NPE)
下面是您的代码实际执行的操作:
val nonNullView: View = this.currentFocus!! // crashes if null
val view: View? = nonNullView
如您所见,如果值为null,则code>必须引发异常,因为null值的类型不能是视图
(不可为null)
在您的情况下,您最终得到了一个可为空的类型视图?
,因此您不需要强加的额外临时限制代码>,因此您也可以将其删除:
val view: View? = this.currentFocus
删除代码>这样视图将为空,并且将调用finish您正在使用的。如果currentFocus为空,则会引发NPE。[Null Safety]()安全解除引用操作符本身不应该抛出NPE,但可能是它周围的其他东西导致了NPE,但我们需要查看代码才能确定。请再问一个问题