Исключение нулевого указателя в конструкторе CursorLoader - PullRequest
1 голос
/ 24 июня 2011

У меня возникли трудности с отладкой исключения нулевого указателя.

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 конструктор, между логами операторов.Журнал показывает, что tableUri, projection и, конечно, this не равны нулю.Вызов «оператор достигнут» никогда не достигается.Остальные нули в вызове конструктора должны быть там, и они определены в API .Я могу изменить вызов конструктора, чтобы использовать строковые литералы и массивы вместо этих трех нулей, и выдается то же исключение.Кто-нибудь знает, что случилось?

Я хотел бы проверить источник CursorLoader для подсказок, но Google не выпустил источник для классов в API уровня 12 этого проекта с открытым исходным кодом.

1 Ответ

1 голос
/ 29 июня 2011

Проблема не имела ничего общего с CursorLoader, это было то, что я передал CursorLoader ссылку на this до завершения конструктора. Метод createLoader был вызван методом, который был вызван методом, который был вызван конструктором.

Этот код находится внутри подкласса Application, что, насколько я знаю, является плохой практикой, потому что все, что я использую для этого, - это обмен данными между действиями, где это должно быть сделано с помощью Intents и Bundles. Поэтому я на самом деле просто изменил заголовок метода для конструктора, чтобы вместо него переопределить метод onCreate, что было более подходящим, и исправил мою проблему.

...