У меня возникли трудности с отладкой исключения нулевого указателя.
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 этого проекта с открытым исходным кодом.