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。
解决步骤
检查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对象。
额外优化建议
- 避免Adapter直接依赖ViewModel:建议在ViewModel层提前将员工数据与对应薪资整合成一个数据类(比如
EmployeeWithSalarySum),直接给Adapter传递整合后的列表,既解耦依赖,也能减少多次数据库查询的性能消耗。 - 处理SQL查询空值:当员工无薪资记录时,
sum(amount)会返回null,而当前DAO方法返回double会触发Room异常,建议将返回类型改为可空的Double,并在代码中处理null情况:
Repository中处理空值:@Query("select sum(amount) from salary where empId=:emp_id") Double getSalariesSum(long emp_id);Double sum = salaryDAO.getSalariesSum(emp_id); double value = sum != null ? sum : 0.0; listener.onValueSubmit(value);
- 避免Adapter直接依赖ViewModel:建议在ViewModel层提前将员工数据与对应薪资整合成一个数据类(比如
内容的提问来源于stack exchange,提问作者Taha Younis
相关产品推荐
相关产品推荐

