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

Room数据库查询员工薪资总和时出现空指针异常求助

Room数据库查询员工薪资总和时触发空指针异常求助

我在学习Room数据库时遇到问题:已经成功创建Room数据库,并在RecyclerView中展示了员工姓名,现在想要实现查询每位员工的薪资总和并展示在RecyclerView中的功能,但出现了空指针异常。

错误信息如下:

Attempt to invoke virtual method 'void com.app.roomdatabase.database.MyViewModel.getSalariesSum(long, com.app.roomdatabase.database.GetSalarySumListener)' on a null object reference
    at com.app.roomdatabase.Adapters.EmployeeSalaryAdapter$viewHolder.bind(EmployeeSalaryAdapter.java:68)
    at com.app.roomdatabase.Adapters.EmployeeSalaryAdapter.onBindViewHolder(EmployeeSalaryAdapter.java:49)
    at com.app.roomdatabase.Adapters.EmployeeSalaryAdapter.onBindViewHolder(EmployeeSalaryAdapter.java:19)

查询薪资的SQL语句:

@Query("select sum(amount) from salary where empId=:emp_id")
double getSalariesSum(long emp_id);

相关代码如下:

Repository代码

public void getSalariesSum(long emp_id, GetSalarySumListener listener ) {
    MyRoomDatabase.databaseWriteExecuter.execute(new Runnable() {
        @Override
        public void run() {
            double value = salaryDAO.getSalariesSum(emp_id);
            listener.onValueSubmit(value);
        }
    });
}

GetSalarySumListener代码

public interface GetSalarySumListener {
void onValueSubmit(double value);}

ViewModel代码

public void getSalariesSum(long emp_id, GetSalarySumListener listener ){
    repository.getSalariesSum(emp_id,listener);
}

Adapter代码

public class EmployeeSalaryAdapter extends RecyclerView.Adapter<EmployeeSalaryAdapter.viewHolder> {

List <Employee> employees;
private MyViewModel mvm;

public EmployeeSalaryAdapter(List <Employee> employees, MyViewModel mvm) {
    this.employees = employees;
    this.mvm = mvm;
}

public List <Employee> getEmployees() {
    return employees;
}

public void setEmployees(List <Employee> employees) {
    this.employees = employees;
    notifyDataSetChanged();
}

@NonNull
@Override
public viewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    return new viewHolder(LayoutInflater.from(parent.getContext())
            .inflate(R.layout.emp_sal_item,parent,false));
}

@Override
public void onBindViewHolder(@NonNull EmployeeSalaryAdapter.viewHolder holder, int position) {
    Employee employee = employees.get(position);
    holder.bind(employee,mvm);
}

@Override
public int getItemCount() {
    return employees.size();
}

public class viewHolder extends RecyclerView.ViewHolder {
    EmpSalItemBinding binding;
    Employee employee;
    public viewHolder(@NonNull View itemView) {
        super(itemView);
        binding= EmpSalItemBinding.bind(itemView);

    }
    public void bind(Employee employee, MyViewModel mvm) {
        this.employee = employee;
        binding.empNameTv.setText(employee.getName());
        mvm.getSalariesSum(employee.getId(), new GetSalarySumListener() {
            @Override
            public void onValueSubmit(double value) {
                binding.empSalaryTv.setText(String.valueOf(value));
            }
        });
    }
}

问题原因及解决办法

核心原因

空指针异常明确指向调用mvm.getSalariesSum()时mvm为null,说明创建EmployeeSalaryAdapter实例时,传入的MyViewModel参数是null。

解决步骤

  1. 检查Adapter初始化逻辑
    在Activity或Fragment中创建Adapter的位置,确保传入的ViewModel是已正确初始化的实例,示例代码:

    // Activity中正确初始化ViewModel并传入Adapter
    MyViewModel viewModel = new ViewModelProvider(this).get(MyViewModel.class);
    EmployeeSalaryAdapter adapter = new EmployeeSalaryAdapter(employeeList, viewModel);
    recyclerView.setAdapter(adapter);
    

    绝对不能传入null或者未完成初始化的ViewModel对象。

  2. 额外优化建议

    • 避免Adapter直接依赖ViewModel:建议在ViewModel层提前将员工数据与对应薪资整合成一个数据类(比如EmployeeWithSalarySum),直接给Adapter传递整合后的列表,既解耦依赖,也能减少多次数据库查询的性能消耗。
    • 处理SQL查询空值:当员工无薪资记录时,sum(amount)会返回null,而当前DAO方法返回double会触发Room异常,建议将返回类型改为可空的Double,并在代码中处理null情况:
      @Query("select sum(amount) from salary where empId=:emp_id")
      Double getSalariesSum(long emp_id);
      
      Repository中处理空值:
      Double sum = salaryDAO.getSalariesSum(emp_id);
      double value = sum != null ? sum : 0.0;
      listener.onValueSubmit(value);
      

内容的提问来源于stack exchange,提问作者Taha Younis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 06:45:16