Ошибка принудительного закрытия Android

#android

#Android

Вопрос:

На самом деле я новичок в Android и Java (изначально я программист на Pascal), и у меня проблема — мое приложение принудительно закрывается, и я не могу понять, почему.

Я просто пытаюсь вызвать действие для отображения таблицы данных из моей (в настоящее время пустой) базы данных. Я использую книгу «Learning Android» и в значительной степени вырезал и вставил из нее большую часть своего кода. Я реорганизовал все свои процедуры доступа к БД для определенного класса, но, похоже, это проблема.

Вызывающий метод:

 @Override
public void onResume() {
    super.onResume();

    Log.i(TAG, "In onResume...");

    // Link to WYWHApplication module
    WYWHApplication wywh = (WYWHApplication) this.getApplication();

    // Fetch trip list
    Cursor tripList = wywh.getBasicList();
  

и это класс DB:

 public class WYWHApplication extends Application {

private static final String TAG = WYWHApplication.class.getSimpleName();

@Override
public void onCreate() {
    super.onCreate();
    Log.i(TAG, "In onCreate for app...");
}

@Override
public void onTerminate() {
    super.onTerminate();
    Log.i(TAG, "In onTerminate for app...");
}

// Link to DB class
private DatabaseUtils dbUtils;

// Accessor method - how other modules get access to DB.
public DatabaseUtils getDBData() {
    return dbUtils;
}

public synchronized Cursor getBasicList() {

    Log.i(TAG, "Getting basic list of trips");

    // Get list of DB entries
    Cursor tripEntries = this.getDBData().fetchList("TRIP_TABLE");

    Log.i(TAG, "...returned from getting basic list of trips");

    return tripEntries;
}
  

LogCat имеет следующее:

 10-14 20:38:29.543: INFO/WYWHApplication(305): In onCreate for app...
10-14 20:38:29.603: DEBUG/WYWH(305): Start of onCreate....
10-14 20:38:30.283: DEBUG/WYWH(305): ...end of onCreate.
10-14 20:41:05.943: INFO/ActivityManager(58): Starting activity: Intent { cmp=co.uk.sanetech.wywh/.TripsScreenActivity }
10-14 20:41:06.183: INFO/Trips(305): Start of onCreate....
10-14 20:41:06.773: INFO/Trips(305): In onResume...
10-14 20:41:06.773: INFO/WYWHApplication(305): Getting basic list of trips
10-14 20:41:06.793: DEBUG/AndroidRuntime(305): Shutting down VM
10-14 20:41:06.793: WARN/dalvikvm(305): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
10-14 20:41:06.993: ERROR/AndroidRuntime(305): FATAL EXCEPTION: main
10-14 20:41:06.993: ERROR/AndroidRuntime(305): java.lang.RuntimeException: Unable to resume activity {co.uk.sanetech.wywh/co.uk.sanetech.wywh.TripsScreenActivity}: java.lang.NullPointerException
10-14 20:41:06.993: ERROR/AndroidRuntime(305):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3128)
  

(здесь немного осталось)

 10-14 20:41:06.993: ERROR/AndroidRuntime(305): Caused by: java.lang.NullPointerException
10-14 20:41:06.993: ERROR/AndroidRuntime(305):     at co.uk.sanetech.wywh.WYWHApplication.getBasicList(WYWHApplication.java:36)
10-14 20:41:06.993: ERROR/AndroidRuntime(305):     at co.uk.sanetech.wywh.TripsScreenActivity.onResume(TripsScreenActivity.java:42)
10-14 20:41:06.993: ERROR/AndroidRuntime(305):     at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1149)
10-14 20:41:06.993: ERROR/AndroidRuntime(305):     at android.app.Activity.performResume(Activity.java:3823)
10-14 20:41:06.993: ERROR/AndroidRuntime(305):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3118)
10-14 20:41:06.993: ERROR/AndroidRuntime(305):     ... 12 more
  

Код для списка выборки:

 public Cursor fetchList(String tabName) {

   Log.i(TAG, "In fetchList...");
  

… поскольку я не получаю это последнее сообщение об отладке, это наводит на мысль (для меня), что проблема заключается в вызове fetchList, но не уверен, почему.

Любая помощь с благодарностью принимается…

Ответ №1:

Из опубликованного вами кода экземпляр dbUtils никогда не инициализируется ни для чего, поэтому он равен null. Следовательно, при попытке вызова fetchList() вы вызываете метод для экземпляра, который не существует.

Вероятно, ваше объявление должно выглядеть примерно так

 // Link to DB class
private DatabaseUtils dbUtils = new DatabaseUtils();

// Accessor method - how other modules get access to DB.
public DatabaseUtils getDBData() {
    return dbUtils;
}
  

Где объект создается до того, как вы попытаетесь получить к нему доступ к методам.

HTH.

Ответ №2:

Посмотрите на это:

 this.getDBData().fetchList("TRIP_TABLE");
  
  • или это null = невозможно
  • или getDBData() возвращает значение null = возможно
  • или fetchList («TRIP_TABLE»); возвращает значение null (возможно, TRIP_TABLE не существует) = наиболее возможный

Комментарии:

1. Вау, спасибо за быстрое response…my база данных пуста, и, по сути, onCreate, который должен ее создать, похоже, не вызывается: code class DbHelper extends SQLiteOpenHelper { // Constructor public DbHelper (Context context) { super (context, DB_NAME, null, DB_VERSION); } @Override public void onCreate (SQLiteDatabase db) { Log.i(TAG, "Creating DB..."); String sql = "create table " TRIP_TABLE " ("