删除Firebase交易条目时触发NullPointerException(ExpenseInfo对象为null)的问题求助
删除Firebase交易条目时触发NullPointerException(ExpenseInfo对象为null)的问题求助
我看到你在删除Firebase交易条目时遇到了NullPointerException,问题出在ExpenseInfo expenseInfo = dataSnapshot.getValue(ExpenseInfo.class);返回null后,直接调用它的方法(比如getTuition())导致报错。咱们一步步来排查和解决这个问题:
问题原因分析
从你的代码和Firebase数据来看,主要有两个核心原因:
- 目标路径下无对应ExpenseInfo数据:比如删除
Deposit类型交易时,该日期下可能还没有生成过支出记录,Firebase数据库里不存在对应的expenseInfo节点,因此dataSnapshot.getValue()返回null。 - 未做null判断就调用对象方法:你拿到
expenseInfo后直接操作字段,没有先检查它是否为空,这直接触发了空指针异常。
另外还有一个逻辑瑕疵:你现在不管交易是Expense还是Deposit,都去expenseInfo里减去金额——这显然不符合业务逻辑,Deposit是收入,应该对应调整收入相关记录(或者如果你的设计里收入也归类在expenseInfo中,那应该是增加金额而非减少)。
解决方案
1. 添加Null检查,自动创建默认实例
在使用expenseInfo之前,先判断它是否为null,如果为空就初始化一个新的ExpenseInfo实例(你的ExpenseInfo默认构造函数已经把所有字段设为0,刚好满足初始状态需求):
@Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { ExpenseInfo expenseInfo = dataSnapshot.getValue(ExpenseInfo.class); // 新增null检查,为空则创建默认实例 if (expenseInfo == null) { expenseInfo = new ExpenseInfo(); } Log.d("hi", "onDataChange: " + transactionData.getType()); // 后续的类别判断逻辑... }
2. 区分交易类型处理金额
根据交易的type字段调整逻辑,Expense类型才减少支出,Deposit类型(收入)对应处理收入节点(如果存在)或跳过不必要的支出节点操作:
// 在onDataChange里先判断交易类型 if (transactionData.getType().equals("Expense")) { // 执行现有的支出减少逻辑 if(transactionData.getCategory().equals("Food")){ expenseInfo.setFood(expenseInfo.getFood() - transactionData.getAmount()); } // ...其他类别判断逻辑 } else if (transactionData.getType().equals("Deposit")) { // 这里可以处理收入的调整逻辑,比如操作对应的IncomeInfo节点 // 若暂时没有收入节点,可跳过或做日志记录,避免修改expenseInfo Log.d("DepositDelete", "Skipping expenseInfo update for deposit transaction"); }
3. 验证数据库路径正确性
可以在代码里打印当前访问的Firebase路径,确认是否与数据库中的节点一致,避免路径拼写或格式错误:
final DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference(uid).child("expenseInfo").child(dailyData.getYear()).child(dailyData.getMonth()); // 打印路径,确认是否正确 Log.d("FirebasePath", "Current path: " + databaseReference.toString());
测试建议
你可以先测试删除Expense类型的交易(比如Food类别的100元支出),确认是否还会报错;再针对Deposit类型交易调整对应的收入逻辑,逐步验证功能正确性。
备注:内容来源于stack exchange,提问作者Jamshed Ali
相关产品推荐
相关产品推荐

