尽管有安全措施,我的Kotlin代码中的NullPointerException仍然存在

尽管有安全措施,我的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

下面的代码段来自我的onOptionsItemSelected函数。如果软键盘正在显示或调用活动的finish函数,则假设下面的第2-5行隐藏软键盘

我从一个关于堆栈溢出的“如何隐藏软键盘”的答案中得到了这段代码。它在我的手机上运行得很好,但当我最近在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:


卸下
,它应该工作得更好。

运算符被称为非空断言运算符——如果
currentFocus
为空,则将抛出NPE。由于您的
视图
可以是
null
,因此可以安全地删除
操作员

阅读:


    • 代码的要点
运算符将可为null类型的值转换为不可为null的等效值,同时积极确保该值确实不为null(否则将抛出NPE)

下面是您的代码实际执行的操作:

val nonNullView: View = this.currentFocus!! // crashes if null
val view: View? = nonNullView
如您所见,
必须引发异常,因为null值的类型不能是
视图
(不可为null)

在您的情况下,您最终得到了一个可为空的类型
视图?
,因此您不需要
强加的额外临时限制,因此您也可以将其删除:

val view: View? = this.currentFocus

删除
这样视图将为空,并且将调用finish您正在使用的。如果currentFocus为空,则会引发NPE。[Null Safety]()安全解除引用操作符本身不应该抛出NPE,但可能是它周围的其他东西导致了NPE,但我们需要查看代码才能确定。请再问一个问题