getActivity null异常警告?

时间:2018-10-15 17:04:38

标签: android android-fragments android-activity

我有一个片段,将在其中执行以下操作:

getActivity().runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                                }
                    });

在这里,我收到runOnUiThread的警告may produce NullPointerException。 该代码可以正常工作。AndroidStudio建议我这样更改代码:

Objects.requireNonNull(getActivity()).runOnUiThread(new Runnable() {
                        @Override
                        public void run() {

那是明智的吗?还有其他/更好的方法吗?

3 个答案:

答案 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指针。