更新App后无法接收Firebase数据 触发空字符串转数字崩溃
问题根因
崩溃日志已经明确给出错误点:java.lang.NumberFormatException: empty String,即执行Double.parseDouble()时传入了空字符串,出错位置是HomePageActivity.java第322行的版本号比较逻辑,和Firebase存储规则、后台字段实际值无关。
你拿不到Latest-V值的核心原因有两个:
- 你使用的Sketchware近期更新调整了Firebase组件的异步逻辑:之前版本封装层默认会等待数据拉取完成再执行后续代码,更新后数据拉取是完全异步的,你在点击事件里直接执行
latest = NewMap.get((int)0).get("Latest-V").toString();时,Firebase的数据根本还没返回到本地,NewMap是空的,自然取不到值。 - 取值逻辑本身存在容错缺失:硬编码取
NewMap索引为0的元素本身就不可靠,Firebase返回的键值对没有固定顺序,一旦返回的列表长度为0、或者索引0的元素不存在Latest-V字段,就会拿到空值,触发格式转换崩溃。
修复步骤
- 调整Firebase数据拉取时机:不要在点击事件触发时才临时拉取版本号,把版本号拉取逻辑放到页面初始化的
onCreate阶段,在Firebase组件的数据接收完成回调里给latest变量赋值,加一个布尔标记位记录数据是否加载完成,数据没加载完时点击按钮直接提示加载中,不要执行版本比较逻辑。 - 给数字转换加全量容错,所有
Double.parseDouble调用前先判空、判空字符串,加异常捕获,从根源上避免格式转换崩溃,参考代码:
double latestVer = 0.0; double localVer = 0.0; try { if (latest != null && !latest.trim().isEmpty()) { latestVer = Double.parseDouble(latest.trim()); } if (your_version != null && !your_version.trim().isEmpty()) { localVer = Double.parseDouble(your_version.trim()); } } catch (NumberFormatException e) { e.printStackTrace(); } // 后续版本比较直接用latestVer和localVer两个变量即可
- 改掉硬编码取列表索引0的取值方式:在Sketchware的Firebase数据接收回调里,直接通过键名
Latest-V取对应值,不要把返回结果转成List再按索引取,避免顺序问题导致拿错值、拿不到值。
日志开头的
Invalid toNumber block operation是Sketchware可视化块封装层抛出的提示,本质就是块接收到空字符串无法转数字,和Firebase服务端无关。
内容的提问来源于stack exchange,提问作者Steven Kollar
相关产品推荐
相关产品推荐

