尽管有保护措施,但我的 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