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

更新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字段,就会拿到空值,触发格式转换崩溃。
修复步骤
  1. 调整Firebase数据拉取时机:不要在点击事件触发时才临时拉取版本号,把版本号拉取逻辑放到页面初始化的onCreate阶段,在Firebase组件的数据接收完成回调里给latest变量赋值,加一个布尔标记位记录数据是否加载完成,数据没加载完时点击按钮直接提示加载中,不要执行版本比较逻辑。
  2. 给数字转换加全量容错,所有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两个变量即可
  1. 改掉硬编码取列表索引0的取值方式:在Sketchware的Firebase数据接收回调里,直接通过键名Latest-V取对应值,不要把返回结果转成List再按索引取,避免顺序问题导致拿错值、拿不到值。

日志开头的Invalid toNumber block operation是Sketchware可视化块封装层抛出的提示,本质就是块接收到空字符串无法转数字,和Firebase服务端无关。

内容的提问来源于stack exchange,提问作者Steven Kollar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 10:36:17