首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NullPointerException在我的Kotlin代码中,尽管有安全措施

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

Stack Overflow用户
提问于 2018-07-30 08:26:27
回答 3查看 416关注 0票数 1

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

我从堆栈溢出的“如何隐藏SoftKeyboard”的答案中获得了这段代码。它在我的手机上运行得很好,但是当我最近在playstore上提交我的应用程序进行内部测试时,我发现它有时会抛出NPE。有人能解释一下为什么会发生这种事吗?

代码语言:javascript
复制
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 
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-07-30 13:51:54

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

下面是您的代码实际上正在做的事情:

代码语言:javascript
复制
val nonNullView: View = this.currentFocus!! // crashes if null
val view: View? = nonNullView

正如您所看到的,如果值为null,!!必须抛出一个异常,因为空值不能是View (非空)类型。

在您的情况下,您最终使用的是可空类型View?,因此您不需要!!施加的额外临时限制,所以您最好删除它:

代码语言:javascript
复制
val view: View? = this.currentFocus
票数 0
EN

Stack Overflow用户

发布于 2018-07-30 08:32:34

!!操作符被称为非空断言操作符--如果currentFocus为null,这将引发NPE。因为您的view可以是null,所以删除!!操作符是安全的。

阅读:

票数 2
EN

Stack Overflow用户

发布于 2018-07-30 08:31:58

您确定您清楚地了解!!操作符是如何工作的吗?如果this.currentFocus为空,则表示它应该抛出一个nullpointerexception:https://kotlinlang.org/docs/reference/null-safety.html

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51589823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档