我在LogCat中获得以下行,在打开dbHelper
数据库时似乎指向空SQLite
。
java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler)' on a null object reference
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:223)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163)
at com.---.---.GasDataSource.open(GasDataSource.java:29)
at com.---.---.Vehicle.<init>(Vehicle.java:33)
at com.---.---.GasFragment$1$3.onClick(GasFragment.java:212)
at android.view.View.performClick(View.java:5201)
at android.view.View$PerformClick.run(View.java:21163)
at android.os.Handler.handleCallback(Handler.java:746)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5443)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
这是Stacktrace中列出的代码链(它引用了三行):
实例化新对象:
Vehicle v = new Vehicle(getActivity(), vId); // GasFragment.java:212
打开对象内的数据源以加载现有属性
public Vehicle(Context mContext, int vehicleId) {
GasDataSource datasource = new GasDataSource(mContext);
datasource.open(); // Vehicle.java:33
执行实际的Open方法
database = dbHelper.getWritableDatabase(); // GasDataSource.java:29
补充代码:GasDataSource构造函数:
public GasDataSource(Context context) {
dbHelper = new MySQLiteHelper(context);
}
我不明白dbHelper
如何为空。我唯一能想到的是上下文为空或数据库已经关闭,因为这发生在应用程序在后台很长一段时间,当我打开它并点击活动中的“保存”按钮时(触发)这段代码部分)。
有人可能确定原因,如果没有,至少在这里进行空检查的最佳方法是什么?在这一行上做这件事似乎很奇怪(我之前从未见过它在例子中):dbHelper.getWritableDatabase()
;