通过 intent putString 将值传递给另一个 activity 会导致应用程序崩溃并出现 nullPointerException
Passing value to another activity via intent putString is crashing app with nullPointerException
我知道这里有很多这样的问题 - 但我相信我的问题是独一无二的。
我有一个模块列表视图,当用户选择一个模块时,另一个 activity 打开显示该模块的 'decks'。这需要第二个 activity 知道单击了哪个列表视图项。以下是我尝试实现这一目标的方法。
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);
});
在新的 activity 中,我访问 moduleName 并且我是这样的:
Bundle extras = getIntent().getExtras();
assert extras != null;
String moduleId = extras.getString("EXTRA_MODULE_ID");
String moduleName = extras.getString("EXTRA_MODULE_NAME");
然后我使用 moduleName 来设置 Title 和 moduleId 来访问 firebase 并填充一个列表视图。都好。变量按应有的方式传递。
但在我的第二个 activity 中,我有对话框让用户使用以下参考从 firebase 数据库添加和删除 'decks'...
decksDatabaseReference = firebaseDatabase.getReference().child(userID).child("decks").child(moduleId);
使用此参考 - 用户可以在第二个 activity
中将 'decks' 添加到列表视图
//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));
这会使应用程序崩溃。但是当我下次打开该应用程序时,新牌组就在第二个 activity 中。所以我不知道为什么应用程序崩溃会出现空指针
这里是错误:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ec16358.examcompanion/com.ec16358.examcompanion.FlashCardDecks}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.BaseBundle.getString(java.lang.String)' on a null object reference
...
at com.ec16358.examcompanion.FlashCardDecks.onCreate(FlashCardDecks.java:48)
(FlashCardDecks 第 48 行 = String moduleId = extras.getString("EXTRA_MODULE_ID");
)
这有效
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");
}
我知道这里有很多这样的问题 - 但我相信我的问题是独一无二的。
我有一个模块列表视图,当用户选择一个模块时,另一个 activity 打开显示该模块的 'decks'。这需要第二个 activity 知道单击了哪个列表视图项。以下是我尝试实现这一目标的方法。
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);
});
在新的 activity 中,我访问 moduleName 并且我是这样的:
Bundle extras = getIntent().getExtras();
assert extras != null;
String moduleId = extras.getString("EXTRA_MODULE_ID");
String moduleName = extras.getString("EXTRA_MODULE_NAME");
然后我使用 moduleName 来设置 Title 和 moduleId 来访问 firebase 并填充一个列表视图。都好。变量按应有的方式传递。
但在我的第二个 activity 中,我有对话框让用户使用以下参考从 firebase 数据库添加和删除 'decks'...
decksDatabaseReference = firebaseDatabase.getReference().child(userID).child("decks").child(moduleId);
使用此参考 - 用户可以在第二个 activity
中将 'decks' 添加到列表视图 //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));
这会使应用程序崩溃。但是当我下次打开该应用程序时,新牌组就在第二个 activity 中。所以我不知道为什么应用程序崩溃会出现空指针
这里是错误:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ec16358.examcompanion/com.ec16358.examcompanion.FlashCardDecks}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.BaseBundle.getString(java.lang.String)' on a null object reference
...
at com.ec16358.examcompanion.FlashCardDecks.onCreate(FlashCardDecks.java:48)
(FlashCardDecks 第 48 行 = String moduleId = extras.getString("EXTRA_MODULE_ID");
)
这有效
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");
}