Android ContentDescriptor在实例化时引发NullPointerException

Android ContentDescriptor在实例化时引发NullPointerException,android,android-contentprovider,android-contentresolver,Android,Android Contentprovider,Android Contentresolver,我的许多用户在实例化内容描述符时都面临NullPointerException问题 Fatal Exception: java.lang.NullPointerException: Attempt to read from field 'java.lang.String android.content.UriMatcher.mText' on a null object reference at android.content.UriMatcher.addURI(UriMatche

我的许多用户在实例化内容描述符时都面临NullPointerException问题

Fatal Exception: java.lang.NullPointerException: Attempt to read from field 'java.lang.String android.content.UriMatcher.mText' on a null object reference
       at android.content.UriMatcher.addURI(UriMatcher.java:186)
       at com.getsuperapp.chat.db.ContentDescriptor.getUriMatcher(SourceFile:25)
       at com.getsuperapp.chat.db.DatabaseProvider.query(SourceFile:33)
       at android.content.ContentProvider.query(ContentProvider.java:1017)
       at android.content.ContentProvider$Transport.query(ContentProvider.java:238)
       at android.content.ContentResolver.query(ContentResolver.java:497)
       at android.content.ContentResolver.query(ContentResolver.java:439)
可以找到设备和环境的集合

ContentDescriptor文件是

/**
* A  few constants from other classes used in the file
*
* from UserTable.java
* public static final String PATH = "user_table";
* public static final int PATH_TOKEN = 10;
*/
public class ContentDescriptor {

    private static UriMatcher URI_MATCHER = null;
    private static Uri BASE_URI = null;

    public static UriMatcher getUriMatcher(Context appContext) {

        String AUTHORITY = appContext.getPackageName() + ".quickblox";

        if (URI_MATCHER == null) {
            URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
//The line below is throwing the exception.
            URI_MATCHER.addURI(AUTHORITY, UserTable.PATH, UserTable.PATH_TOKEN); 
            URI_MATCHER.addURI(AUTHORITY, DialogTable.PATH, DialogTable.PATH_TOKEN);
            URI_MATCHER.addURI(AUTHORITY, MessageTable.PATH, MessageTable.PATH_TOKEN);
            URI_MATCHER.addURI(AUTHORITY, ChatInfoTable.PATH, ChatInfoTable.PATH_TOKEN);
        }
        return URI_MATCHER;
    }

    public static Uri getBaseUri(Context appContext) {
        String AUTHORITY = appContext.getPackageName() + ".quickblox";
        if (BASE_URI == null) {
            BASE_URI = Uri.parse("content://" + AUTHORITY);
        }
        return BASE_URI;
    }

}
如果你需要任何进一步的信息,请告诉我。有人能给我提供一些关于这方面的信息吗。我无法重现我那一头的崩溃

编辑


伙计们不要在没有阅读的情况下把这篇文章归入任何其他NPE类别。它可以在很多设备上正常运行。初始化参数为常量。代码中对其崩溃的行也进行了注释。

您的权限、路径和路径标记(全部)的值是什么?根据值和Android版本的不同,应用程序在您的应用程序上运行时可能会出现以下情况:。我想这就是你想开始挖掘的地方。另外,您是否从开发人员控制台或某个臭虫报告库收到了臭虫报告?如果是,哪些Android版本有相同的报告?这可能有助于重现失败。或者让大量设备/模拟器在不同版本上运行,并尝试手动获取。

可能重复感谢,但实际上并非如此。问题隐藏在aosp的内容描述符中。我想了解一下为什么会发生这种情况。如果您已经阅读了代码,那么实例化是通过常量传递的,因此问题并不真正与输入有关。模型类中的静态字段(PATH或PATH_标记)中有一个为空。确保它们不会在任何地方被修改。此外,您可能希望对这些字段使用getter/setter。检查文件上方的注释。我在很多设备上运行它,它不会崩溃。因此需要一些输入。它通过注释突出显示。这里是指向所有我的路径标记的链接。我使用Fabric记录崩溃,崩溃发生在各种各样的设备上,最近在Nexus5上也发生过。我已经就此向谷歌提出了一个问题,但它甚至还没有被分配。不幸的是,这种情况并不常见。它发生在各种设备上,在从棒棒糖到棉花糖(5.0.1到6.0.1)的android版本上。感谢你的链接,帮助我开始:)我不认为这个补丁对我有效,因为我的路径中没有“\”字符是的,我只是用你输入的数据运行了这个实现,它不应该崩溃。最后一个问题是:类是从不同的进程还是线程调用的?如果是,那么您可能希望尝试同步对getUriMatcher的访问,看看这是否有帮助。但我想主要的问题是,您无法重现错误,因此无法针对它测试修复。另一方面,同步访问不会破坏任何东西,因此请立即尝试。