代码之家  ›  专栏  ›  技术社区  ›  Javallion

我的Kotlin代码中的NullPointerException尽管有保护措施

  •  0
  • Javallion  · 技术社区  · 6 年前

    下面的代码片段来自我的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 
    
    3 回复  |  直到 6 年前
        1
  •  0
  •   Joffrey    6 年前

    重点 !! 运算符将可为空类型的值转换为不可为空的等价值,同时积极确保该值确实不为空(否则抛出NPE)。

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

    val nonNullView: View = this.currentFocus!! // crashes if null
    val view: View? = nonNullView
    

    如你所见, !! 如果值为空,则必须引发异常,因为空值不能为类型 View (不可为空)。

    在你的例子中,你最终得到了一个可以为空的类型 View? 总之,你不需要 !! ,所以您也可以将其移除:

    val view: View? = this.currentFocus
    
        2
  •  2
  •   shiftpsh    6 年前

    !! 运算符被称为 非空断言运算符 -如果 currentFocus 为空。自从你 view 可以是 null ,放下 !! 接线员。

    阅读:

        3
  •  1
  •   Joffrey    6 年前

    你确定你很清楚 !! 接线员工作?如果 this.currentFocus 为空,表示应抛出一个空指针异常: https://kotlinlang.org/docs/reference/null-safety.html

    移除 !! ,它应该工作得更好。