You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

删除Firebase交易条目时触发NullPointerException(ExpenseInfo对象为null)的问题求助

删除Firebase交易条目时触发NullPointerException(ExpenseInfo对象为null)的问题求助

我看到你在删除Firebase交易条目时遇到了NullPointerException,问题出在ExpenseInfo expenseInfo = dataSnapshot.getValue(ExpenseInfo.class);返回null后,直接调用它的方法(比如getTuition())导致报错。咱们一步步来排查和解决这个问题:

问题原因分析

从你的代码和Firebase数据来看,主要有两个核心原因:

  1. 目标路径下无对应ExpenseInfo数据:比如删除Deposit类型交易时,该日期下可能还没有生成过支出记录,Firebase数据库里不存在对应的expenseInfo节点,因此dataSnapshot.getValue()返回null。
  2. 未做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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 13:57:44