Передача значения другому действию через intent putString приводит к сбою приложения с NullPointerException

#android #android-intent #firebase-realtime-database #onitemclicklistener

#Android #android-намерение #firebase-realtime-database #onitemclicklistener

Вопрос:

Я знаю, что здесь много таких вопросов, но я считаю, что моя проблема уникальна.

У меня есть список модулей, когда пользователь выбирает модуль, открывается другое действие, показывающее «колоды» для этого модуля. Для этого требуется, чтобы второе действие узнало, какой элемент listview был нажат. Ниже я пытаюсь добиться этого.

 modulesListView.setOnItemClickListener((parent, view, position, id) -> {
        ModuleObject moduleObject = list.get(position);

        Intent intent = new Intent(FlashCards.this, FlashCardDecks.class);
        Bundle extras = new Bundle();
        extras.putString("EXTRA_MODULE_ID", moduleObject.getModuleId());
        extras.putString("EXTRA_MODULE_NAME", moduleObject.getModuleName());
        intent.putExtras(extras);
        startActivity(intent);

    });
  

В новом действии я получаю доступ к имени модуля и идентификатору следующим образом:

 Bundle extras = getIntent().getExtras();
    assert extras != null;
    String moduleId = extras.getString("EXTRA_MODULE_ID");
    String moduleName = extras.getString("EXTRA_MODULE_NAME");
  

Затем я использую moduleName для установки заголовка и ModuleID для доступа к firebase и заполнения listview. Все хорошо. Переменные передаются так, как они должны быть.

Но в моем втором действии у меня есть диалоги, которые позволяют пользователям добавлять и удалять «колоды» из базы данных firebase, используя следующую ссылку…

 decksDatabaseReference = firebaseDatabase.getReference().child(userID).child("decks").child(moduleId);
  

Используя эту ссылку, пользователь может добавить «колоды» в listview во втором действии

         //create new deckObjet
        DeckObject deckObject = new DeckObject();
        //get unique id from firebase
        String deckId = decksDatabaseReference.push().getKey();
        //set unique id to deck object
        deckObject.setId(deckId);
        //add new deckObject to database
        decksDatabaseReference.child(deckId).setValue(deckObject);
        //refresh activity to show change in listview
        startActivity(new Intent(FlashCardDecks.this, FlashCardDecks.class));
  

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

Вот ошибка:

java.lang.RuntimeException: не удается запустить activity ComponentInfo{com.ec16358.examcompanion/com.ec16358.examcompanion.FlashCardDecks}: java.lang.Исключение NullPointerException: попытка вызвать виртуальный метод ‘java.lang.Строка android.os.BaseBundle.getString(java.lang.Строка)’ для ссылки на нулевой объект

на com.ec16358.examcompanion.FlashCardDecks.onCreate(FlashCardDecks.java:48)

(Строка 48 FlashCardDecks = String moduleId = extras.getString("EXTRA_MODULE_ID"); )

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

1. Попробуйте проверить это — if (extras!= null) перед доступом к «moduleName» и «ModuleID», чтобы избежать исключения NullPointerException.

Ответ №1:

Это сработало

   if (getIntent().getStringExtra("EXTRA_MODULE_ID") != null amp;amp; (getIntent().getStringExtra("EXTRA_MODULE_NAME") != null)){
            moduleId = bundle.getString("EXTRA_MODULE_ID");
            moduleName = bundle.getString("EXTRA_MODULE_NAME");
        }