我有一个片段,将在其中执行以下操作:
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
}
});
在这里,我收到runOnUiThread
的警告may produce NullPointerException
。
该代码可以正常工作。AndroidStudio建议我这样更改代码:
Objects.requireNonNull(getActivity()).runOnUiThread(new Runnable() {
@Override
public void run() {
那是明智的吗?还有其他/更好的方法吗?
答案 0 :(得分:1)
这取决于您的目标是什么
1):您希望开发人员注意到他在getActivity()
抛出NullPointerException的状态下调用此方法犯了一个错误
private void myMethod() {
if(null == getActivity()) {
throw new IllegalStateException(); // Or NullPointerException
}
// Do your stuff with getActivity()
}
2)您知道getActivity()
在您的情况下不会抛出NullPointerException
:
private void myMethod() {
assert getActivity() != null;
// Do your stuff with getActivity()
}
3)您知道getActivity()
可能为空,您不希望该应用突然停止运行:
private void myMethod() {
if(null == getActivity()) {
return;
}
// Do your stuff with getActivity()
}
使用Objects.requireNonNull()还需要api级别19(4.4(KITKAT))
当然,您是一个友好的开发人员,您会注意到Javadoc中的所有内容:)
您还拥有大量的信息,here
答案 1 :(得分:0)
您可以添加一个空检查,这可能更容易理解。
if(getActivity() != null) {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
}
});
}
但是,您也可以使用方法#requireActivity() 这可以作为getActivity使用,但是如果活动为null(如果片段已分离),它将抛出IllegalStateException
https://developer.android.com/reference/android/support/v4/app/Fragment#requireActivity()
答案 2 :(得分:0)
(1),这是在调用isAdded
之前使用片段检查getActivity()
(将片段添加到主机活动中)的一种好习惯。当片段与主机活动分离时,这有助于避免空指针异常。
if (isAdded() && null != getActivity()) {
// your logic
}
(2) requireNonNull(T obj)
检查指定的对象引用是否不为null。此方法主要用于在方法和构造函数中进行参数验证。
抛出NullPointerException
-如果obj为null
(应用执行可能会在此时终止)。
摘要:根据您当前的情况,requireNonNull(T obj)
不适合。您必须妥善处理null
指针。