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

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

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

为什么它在那里,而不是在程序片段/活动的其他部分? 这个方法已经在谷歌教程中使用 – 这里是链接的ContentProvider代码https://github.com/udacity/Sunshine-Version-2/blob/sunshine_master/app/src/main/java/com/example/android /sunshine/app/data/WeatherProvider.java,即使您仅使用空白活动创build应用程序,并将该方法放在新创build的ContentProvider中,也是如此。

我们应该使用getContext().getContentResolver().notifyChange(uri, null); 外部ContentProvider获取uri通过,然后更新/插入/删除完成notifyChange? 或者也许我们可以修复它?

Solutions Collecting From Web of "Android:getContext()。getContentResolver()有时会得到NullPointerException"

如果你查看ContentProvider的源代码(只要按住SHIFT并点击Android Studio中的类名),那么你会发现该实现是持有types为Context的对象作为mContext。

你的解决scheme是一样的,这意味着如果ContentProvider的mContext是null,你的引用也是null。 所以不需要这个

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

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

如果你可以确保getContext()永远不能为null,那么你可以简单地忽略这个警告。 我想这个警告甚至会消失,只是检查null:

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

你只需要记住,如果getContext()null ,代码将不会被执行。

干杯

编辑:小心答案@Shivani古普塔给你,因为你可以得到不同的上下文。 请参阅: getContext(),getApplicationContext(),getBaseContext()和“this”

getApplicationContext().getContentResolver()希望这将工作。

每当您尝试使用对象的成员或方法时,如果您试图使用其成员/方法的对象为null,则可以有运行时exception。 假设你想使用一个对象obj的成员/方法。 如果你这样使用它:

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

那么你阻止了这个问题。 但是,您可能想要将其作为例外处理,如下所示:

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

好吧,我似乎通过在类的开始处声明Context来自己修复它。

 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(),uri); 在插入/更新/删除/查询方法 – retCursor被返回游标提到的方法。

我已经在我的手机上运行了应用程序,并没有问题,如果我可能会有这个职位的编辑。

编辑:

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