Android:getContext()。getContentResolver()有时会获得NullPointerException

时间:2015-10-07 10:41:14

标签: java android nullpointerexception android-contentresolver

我想问为什么我们得到这个注释:

  

方法调用getContext.getContentResolver()可能会产生   的NullPointerException

为什么它存在而不存在于程序碎片/活动的其他部分?这种方法已经在Google制作的教程中使用 - 这里是ContentProvider代码https://github.com/udacity/Sunshine-Version-2/blob/sunshine_master/app/src/main/java/com/example/android/sunshine/app/data/WeatherProvider.java的链接,即使您只使用空白活动创建一个应用程序,并将该方法放在新创建的ContentProvider中。

我们是否应该在ContentProvider之外使用getContext().getContentResolver().notifyChange(uri, null);获取uri,然后在更新/插入/删除完成后使用notifyChange?或者我们可以以某种方式解决它?

7 个答案:

答案 0 :(得分:9)

如果您查看ContentProvider的源代码(只需按住SHIFT并单击Android Studio中的类名),您就会发现该实现持有一个Context类型的对象作为mContext。

您的解决方案是一样的,这意味着如果ContentProvider的mContext为null,您的引用也将为null。所以没有必要这样做。

为了帮助您,这只是您的IDE的警告,如果您自己制作这样的构造。但在这种情况下,总会有上下文,因为ContentProvider是由您的系统生成的。要避免IDE中的错误,只需在类定义上方写上 @SuppressWarnings(“ConstantConditions”),如:

...
@SuppressWarnings("ConstantConditions")
public class NoteProvider extends ContentProvider {
...

答案 1 :(得分:7)

如果您可以确保 getContext()永远不能 null ,那么您可以忽略此警告。我认为警告甚至会消失,你只需检查null:

if (getContext() != null) {
    getContext().getContentResolver();
}

如果 getContext() null ,您必须记住要执行的代码。

干杯

编辑: 小心@Shivani Gupta给你的答案,因为你可以得到不同的背景。请参阅:Difference between getContext() , getApplicationContext() , getBaseContext() and "this"

答案 2 :(得分:2)

getApplicationContext().getContentResolver() 希望这会奏效。

答案 3 :(得分:0)

每当您尝试使用对象的成员或方法时,如果您尝试使用其成员/方法的对象为null,则可能会出现运行时异常。假设您想要使用对象的成员/方法obj。如果您这样使用它:

if (obj != null) {
    //use members/methods of obj
}

然后你阻止了这个问题。但是,您可能希望将其作为例外处理,如下所示:

try {
    //use members/methods of obj
} catch (NullPointerException npe) {
    //handle the NullPointerException
}

答案 4 :(得分:0)

好吧,似乎我通过在课程开始时声明上下文来自行修复。

public class NoteProvider extends ContentProvider {
    Context context;

然后在 onCreate()

中初始化它
@Override
    public boolean onCreate() {
        mSQLiteOpenHelper = new NoteDbHelper(getContext());
        context = getContext();

        return true;
    }

我认为当我使用 context.getContentResolver()。notifyChange(uri,null); retCursor.setNotificationUri(con​​text.getContentResolver()时,确保我始终拥有Context。 uri); 在insert / update / delete / query方法中 - 通过提到的方法返回游标的retCursor。

我已经在我的手机上运行了应用程序并且还没有问题,如果我愿意,可能会对此帖进行编辑。

修改

毕竟它没有什么区别 - @Mate的回答解释,谢谢你我认为我现在得到它:]

答案 5 :(得分:0)

根据ContentProvider getContext() docs

  

检索此提供程序正在运行的Context。仅在调用onCreate()时可用 - 这将在构造函数中返回null。

因此getContext()方法不会在nullinsert()update()中返回delete(),因为在这些调用之前会调用onCreate()

因此,如果在这种情况下使用该行,则可以禁用该行的警告...

//noinspection ConstantConditions
getContext().getContentResolver().notifyChange(uri, null);

答案 6 :(得分:0)

当您在Fragment或DialogFragment中调用getActivity()getContext()以使用诸如getContentResolver()之类的父活动方法之一时,通常会发生这种情况,因为编译器不确定这些方法是否会返回空值。

要解决此问题,请不要使用getActivity()getContext();您可以分别简单地分别使用requireActivity()requireContext();这些方法可确保返回非null值。

您可以查看答案here