我们是否应该始终对片段内的上下文进行空检查?
Should we always nullcheck Context inside a fragment?
我的片段中有一个非常简单的点击监听器:
button?.setOnClickListener {
val intent = Intent(MyActivity.createIntent(context!!)) // crash here because context is null
startActivity(intent)
}
Crashlytics 显示某些用户在单击此特定按钮时遇到 KotlinNullPointerException
崩溃。现在我知道问题正在发生,因为我正在强制展开 Context。如果我只是将它包装在一个 nullcheck 中,它就不会崩溃。
但我认为我的代码中存在更大的潜在问题,因为我总是在需要时强制解包上下文,而我只对这段特定的代码有问题。
这里的规则是什么?我们是否应该总是 nullcheck 我们的上下文?
单击按钮内部您可以轻松使用:view.getContext()
获取上下文 或在 Kotlin
it.context // which will be never null
即
button?.setOnClickListener {
val intent = Intent(MyActivity.createIntent(it.context)) // this wont ever crash
startActivity(intent)
}
很可能你会接受这样的代码
button?.setOnClickListener {startActivity(MyActivity.createIntent(it.context))}
我相信你 MyActivity.createIntent() 有趣你 return 意图
如果您查看 fragment.getContext()
方法的源代码,您会看到:
@Nullable
public Context getContext() {
return mHost == null ? null : mHost.getContext();
}
也就是说getContext
可以returnnull
。在内部 mHost
表示附加了一个 Activity
片段。片段并不总是附加到它的托管 activity,您可以使用 onAttach
/ onDetach
生命周期回调来观察这一点。
对于您的情况,如前所述,最好的方法是使用来自 View
的上下文
view.setOnClickListener { it.context }
但总的来说,始终检查可为空的内容,并且不要执行 !!
,即使您确定它不是 null
。通过这种方式,您的代码将不易出错,从而提供另一种处理 null
s.
的方法
我的片段中有一个非常简单的点击监听器:
button?.setOnClickListener {
val intent = Intent(MyActivity.createIntent(context!!)) // crash here because context is null
startActivity(intent)
}
Crashlytics 显示某些用户在单击此特定按钮时遇到 KotlinNullPointerException
崩溃。现在我知道问题正在发生,因为我正在强制展开 Context。如果我只是将它包装在一个 nullcheck 中,它就不会崩溃。
但我认为我的代码中存在更大的潜在问题,因为我总是在需要时强制解包上下文,而我只对这段特定的代码有问题。
这里的规则是什么?我们是否应该总是 nullcheck 我们的上下文?
单击按钮内部您可以轻松使用:view.getContext()
获取上下文 或在 Kotlin
it.context // which will be never null
即
button?.setOnClickListener {
val intent = Intent(MyActivity.createIntent(it.context)) // this wont ever crash
startActivity(intent)
}
很可能你会接受这样的代码
button?.setOnClickListener {startActivity(MyActivity.createIntent(it.context))}
我相信你 MyActivity.createIntent() 有趣你 return 意图
如果您查看 fragment.getContext()
方法的源代码,您会看到:
@Nullable
public Context getContext() {
return mHost == null ? null : mHost.getContext();
}
也就是说getContext
可以returnnull
。在内部 mHost
表示附加了一个 Activity
片段。片段并不总是附加到它的托管 activity,您可以使用 onAttach
/ onDetach
生命周期回调来观察这一点。
对于您的情况,如前所述,最好的方法是使用来自 View
view.setOnClickListener { it.context }
但总的来说,始终检查可为空的内容,并且不要执行 !!
,即使您确定它不是 null
。通过这种方式,您的代码将不易出错,从而提供另一种处理 null
s.