Android Studio中Firebase子节点数量存变量及除零异常解决
解决Firebase子节点统计时的除以零异常问题
首先,这个ArithmeticException: divide by zero异常的原因非常明确——你肯定是在某个逻辑里用了值为0的变量做除法运算,大概率是计算出勤率这类操作时用到了total变量,但要么total还没被正确赋值(比如Firebase异步查询还没完成就提前计算),要么确实没有任何考勤记录导致total为0,从而触发了异常。
我来一步步帮你解决这个问题:
第一步:确保正确获取Firebase子节点的数量
Firebase的数据库查询是异步操作,如果你在onCreate里直接同步使用变量的初始值,拿到的只会是0(因为查询还没完成)。必须在数据加载完成的回调里统计节点数量:
private long absent = 0, present = 0, total = 0, attendanceRecord = 0; DatabaseReference dbRef = FirebaseDatabase.getInstance().getReference(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_student_stats); statsResult = (TextView) findViewById(R.id.stats_result); // 假设你有展示结果的TextView // 先获取present子节点的数量 dbRef.child("present").addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { present = dataSnapshot.getChildrenCount(); // 拿到present数量后,再获取absent的数量 getAbsentCount(); } @Override public void onCancelled(DatabaseError databaseError) { // 处理查询失败的情况 statsResult.setText("获取数据失败:" + databaseError.getMessage()); } }); } private void getAbsentCount() { dbRef.child("absent").addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { absent = dataSnapshot.getChildrenCount(); total = present + absent; // 现在所有数据都已获取,开始计算考勤 calculateAttendance(); } @Override public void onCancelled(DatabaseError databaseError) { statsResult.setText("获取数据失败:" + databaseError.getMessage()); } }); }
第二步:计算前先判断除数是否为0
这是解决你当前异常的核心——在做除法运算前,一定要检查total是否为0,避免触发除以零的错误:
private void calculateAttendance() { if (total == 0) { statsResult.setText("暂无任何考勤记录"); return; } // 注意转成浮点型运算,避免整数除法导致结果失真(比如3/5直接得到0) attendanceRecord = Math.round(( (double)present / total ) * 100); statsResult.setText( "出勤率:" + attendanceRecord + "%\n" + "总记录数:" + total + "\n" + "出勤:" + present + "\n" + "缺勤:" + absent ); }
额外注意事项
- 永远不要在Firebase异步查询的回调外直接使用变量的初始值,必须等
onDataChange触发后再处理数据 - 整数除法容易踩坑:如果直接用
present / total(两个long类型),会执行整数除法,结果只会取整数部分,所以一定要先转成double再计算
内容的提问来源于stack exchange,提问作者WesMantooth
相关产品推荐
相关产品推荐

