尽管有保护措施,但我的 Kotlin 代码中出现 NullPointerException
NullPointerException in my Kotlin code despite safeguards
下面的代码片段来自我的 onOptionsItemSelected 函数。如果显示软键盘,下面的第 2-5 行假设隐藏软键盘,否则调用 activity 的完成函数。
我从 'How to Hide a SoftKeyboard' 关于堆栈溢出的答案之一中得到了这段代码。它在我的 phone 上运行良好,但是当我最近在 Playstore 上提交我的应用程序进行内部测试时,我发现它有时会抛出 NPE。有人可以解释为什么会发生这种情况背后的逻辑吗?
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:
https://kotlinlang.org/docs/reference/null-safety.html
删除 !!
,它应该会更好。
!!
运算符称为 Not-null 断言运算符 - 如果 currentFocus
为空,这将抛出 NPE。由于您的 view
可以是 null
,因此删除 !!
运算符是安全的。
阅读:
!!
运算符的要点是将可空类型的值转换为不可空的等效值,同时主动确保该值确实不为空(否则抛出 NPE)。
这是您的代码实际执行的操作:
val nonNullView: View = this.currentFocus!! // crashes if null
val view: View? = nonNullView
如您所见,如果值为 null,!!
必须抛出异常,因为 null 值不能是 View
类型(不可为 nullable)。
在你的例子中,你最终得到了一个可为 null 的类型 View?
,所以你不需要 !!
强加的额外临时限制,所以你也可以删除它:
val view: View? = this.currentFocus
下面的代码片段来自我的 onOptionsItemSelected 函数。如果显示软键盘,下面的第 2-5 行假设隐藏软键盘,否则调用 activity 的完成函数。
我从 'How to Hide a SoftKeyboard' 关于堆栈溢出的答案之一中得到了这段代码。它在我的 phone 上运行良好,但是当我最近在 Playstore 上提交我的应用程序进行内部测试时,我发现它有时会抛出 NPE。有人可以解释为什么会发生这种情况背后的逻辑吗?
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:
https://kotlinlang.org/docs/reference/null-safety.html
删除 !!
,它应该会更好。
!!
运算符称为 Not-null 断言运算符 - 如果 currentFocus
为空,这将抛出 NPE。由于您的 view
可以是 null
,因此删除 !!
运算符是安全的。
阅读:
!!
运算符的要点是将可空类型的值转换为不可空的等效值,同时主动确保该值确实不为空(否则抛出 NPE)。
这是您的代码实际执行的操作:
val nonNullView: View = this.currentFocus!! // crashes if null
val view: View? = nonNullView
如您所见,如果值为 null,!!
必须抛出异常,因为 null 值不能是 View
类型(不可为 nullable)。
在你的例子中,你最终得到了一个可为 null 的类型 View?
,所以你不需要 !!
强加的额外临时限制,所以你也可以删除它:
val view: View? = this.currentFocus