Передача значения другому действию через намерение putString приводит к сбою приложения с nullPointerException - PullRequest
0 голосов
/ 21 апреля 2019

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

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

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);

    });

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

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

Затем я использую moduleName для setTitle и moduleId для доступа к файербазе и заполнения списка. Все хорошо. Переменные передаются так, как они должны быть.

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

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

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

        //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: Невозможно запустить действие ComponentInfo {com.ec16358.examcompanion / com.ec16358.examcompanion.FlashCardDecks}: java.lang.NullPointerException: попытка вызвать виртуальный метод 'java.lang.String android.os .BaseBundle.getString (java.lang.String) 'для ссылки на пустой объект

...

at com.ec16358.examcompanion.FlashCardDecks.onCreate (FlashCardDecks.java:48)

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

1 Ответ

0 голосов
/ 21 апреля 2019

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

  if (getIntent().getStringExtra("EXTRA_MODULE_ID") != null && (getIntent().getStringExtra("EXTRA_MODULE_NAME") != null)){
            moduleId = bundle.getString("EXTRA_MODULE_ID");
            moduleName = bundle.getString("EXTRA_MODULE_NAME");
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...