CursorLoader构造函数中的空指针异常

时间:2011-06-24 15:03:20

标签: android android-3.0-honeycomb

调试空指针异常时遇到一些困难。

E/AndroidRuntime( 1760): java.lang.RuntimeException: Unable to instantiate application edu.lafayette.cs.geology.GeoDatabase: java.lang.NullPointerException

...

E/AndroidRuntime( 1760): Caused by: java.lang.NullPointerException
E/AndroidRuntime( 1760):    at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:101)
E/AndroidRuntime( 1760):    at android.content.Loader.<init>(Loader.java:85)
E/AndroidRuntime( 1760):    at android.content.AsyncTaskLoader.<init>(AsyncTaskLoader.java:90)
E/AndroidRuntime( 1760):    at android.content.CursorLoader.<init>(CursorLoader.java:113)
E/AndroidRuntime( 1760):    at edu.lafayette.cs.geology.GeoDatabase.createLoader(GeoDatabase.java:123)

以下是我的代码中的相关方法createLoader。

private CursorLoader createLoader(int id) {
    Uri tableUri;
    String[] projection;

    // Set the URI to query depending on the id of this loader.
    switch (id) {
    case LOCAL_FOLDER_LOADER:
        tableUri = LocalProvider.CONTENT_URI_FOLDER;
        projection = Folder.COLUMNS;
        break;
    case LOCAL_BEDDING_LOADER:
        tableUri = LocalProvider.CONTENT_URI_BEDDING;
        projection = Bedding.COLUMNS;
        break;
    case LOCAL_CONTACT_LOADER:
        tableUri = LocalProvider.CONTENT_URI_CONTACT;
        projection = Contact.COLUMNS;
        break;
    case LOCAL_FAULT_LOADER:
        tableUri = LocalProvider.CONTENT_URI_FAULT;
        projection = Fault.COLUMNS;
        break;
    case LOCAL_JOINT_SET_LOADER:
        tableUri = LocalProvider.CONTENT_URI_JOINT_SET;
        projection = JointSet.COLUMNS;
        break;
    default:
        throw new IllegalArgumentException("Unknown cursor loader id");
    }

    // Load up that cursor loader. Next, onLoadComplete is called.
    Log.d("createLoader", ""+tableUri);
    Log.d("createLoader", ""+projection);
    Log.d("createLoader", ""+this);
    CursorLoader cursorLoader = new CursorLoader(this, tableUri,
            projection, null, null, null);
    Log.d("createLoader", "statement reached");
    cursorLoader.registerListener(id, this);
    return cursorLoader;
}

第125行是在日志语句之间调用CursorLoader构造函数的行。该日志显示tableUriprojection,当然this不为空。永远无法达到“达成声明”的呼吁。构造函数调用中的其余空值应该在那里,它们是specified in the API。我可以更改构造函数调用以使用字符串文字和数组而不是这三个空值,并抛出相同的异常。有谁知道怎么了?

我想查看CursorLoader来源的线索,但Google尚未发布此“开源”项目的API级别12中的类的源代码。

1 个答案:

答案 0 :(得分:1)

问题与CursorLoader无关,就是我在构造函数完成之前向CursorLoader传递了对this的引用。 createLoader方法由一个方法调用,该方法由构造函数调用的方法调用。

这段代码在Application的子类中,据我所知,这是一种不好的做法,因为我所使用的只是在活动之间共享数据,应该用Intents和Bundles来完成。所以我实际上只是改变了构造函数的方法头来覆盖onCreate方法,这更合适,并解决了我的问题。