Android Firebase child()报pathString参数为null错误如何解决
问题现象
开发Android应用实现菜谱数据更新功能时触发运行时崩溃,报错信息为 Can't pass null for argument 'pathString' in child(),崩溃定位到代码行:databaseReference = FirebaseDatabase.getInstance().getReference("Recipe_Credentials").child(key);
提示传入child()方法的key参数为null。
根因分析
崩溃由代码执行顺序错误导致:
- 成员变量
key声明后未赋值时默认值为null - 原代码在onCreate生命周期中,先执行Firebase数据库引用初始化、调用
.child(key),此时还未从跳转Intent的Bundle中提取并给key赋值 - Firebase Realtime Database的
child()方法不接受null作为路径参数,直接触发空指针异常
修复方案
- 调整onCreate内代码执行顺序:先解析Intent携带的Bundle参数,完成key的赋值后,再初始化对应路径的DatabaseReference
- 增加参数合法性校验:如果Bundle中未携带合法的key值,做兜底异常处理,避免崩溃
修正后的核心实现代码如下:
public class Update_Activity extends AppCompatActivity { ImageView update_Recipe_Image; EditText update_Recipe_Name, update_Recipe_Description, update_Recipe_Price; Button updatebutton, selectImageButton; String key, oldimageUrl; String imageUrl; DatabaseReference databaseReference; StorageReference storageReference; String recipename, recipedescription, recipeprice; private Uri filePath; private final int PICK_IMAGE_REQUEST = 10; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_update); update_Recipe_Image = (ImageView) findViewById(R.id.update_Recipe_Image); update_Recipe_Name = (EditText) findViewById(R.id.update_Recipe_Name); update_Recipe_Description = (EditText) findViewById(R.id.update_Recipe_Description); update_Recipe_Price = (EditText) findViewById(R.id.update_Recipe_Price); updatebutton = (Button) findViewById(R.id.updatebutton); selectImageButton = (Button) findViewById(R.id.selectImageButton); // 优先解析Intent传递的参数 Bundle bundle = getIntent().getExtras(); if (bundle != null){ Glide.with(Update_Activity.this) .load(bundle.getString("oldimageUrl")) .into(update_Recipe_Image); update_Recipe_Name.setText(bundle.getString("recipeNameKey")); update_Recipe_Description.setText(bundle.getString("recipeDescriptionKey")); update_Recipe_Price.setText(bundle.getString("recipePriceKey")); key = bundle.getString("key"); oldimageUrl = bundle.getString("oldimageUrl"); } // 校验key合法性后再初始化数据库引用 if (key == null || key.isEmpty()) { Toast.makeText(this, "菜谱参数异常,无法打开编辑页", Toast.LENGTH_SHORT).show(); finish(); return; } databaseReference = FirebaseDatabase.getInstance().getReference("Recipe_Credentials").child(key); selectImageButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { chooseImage(); } }); updatebutton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { recipename = update_Recipe_Name.getText().toString().trim(); recipedescription = update_Recipe_Description.getText().toString().trim(); recipeprice = update_Recipe_Price.getText().toString().trim(); uploadImage(); } }); } }
报错日志参考
触发崩溃时Logcat输出的核心栈信息如下:
Caused by: java.lang.NullPointerException: Can't pass null for argument 'pathString' in child() at com.google.firebase.database.DatabaseReference.child(DatabaseReference.java:96) at com.example.universityofloralaicafeteria.Admin.Update_Activity.onCreate(Update_Activity.java:62) at android.app.Activity.performCreate(Activity.java:7183) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1220) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2910)
栈信息明确指向onCreate方法中调用child()的代码行,和代码顺序导致的key为null问题完全匹配。
内容的提问来源于stack exchange,提问作者Jabbar Kakar
相关产品推荐
相关产品推荐

