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

自定义IdleNumb类的sub方法导致Android应用崩溃求助

解决IdleNumb类sub方法导致Android模拟器冻结崩溃的问题

问题根源分析

你的sub方法存在三个致命问题,直接引发模拟器冻结或崩溃:

  1. 数组索引越界:
    • 当循环到numbs的最后一个索引时,执行numbs[i + 1] -= 1会访问超出数组长度的位置,触发未捕获的数组越界异常。
    • 如果number.numbs的长度大于当前实例的numbs长度,循环索引i会覆盖到当前numbs不存在的位置,同样引发越界。
  2. 无限死循环:
    • while (numbs[i] < number.numbs[i])的借位逻辑未处理高位无值可借的情况。比如当高位已经是0或负数时,反复执行借位操作后,numbs[i]可能仍然小于number.numbs[i],导致循环无限执行,CPU被占满,模拟器直接冻结,无法输出调试信息。
  3. fixNum()调用时机错误:
    • 每次循环后调用fixNum()会打乱借位后的数值状态,导致后续计算逻辑混乱。

修复后的sub方法代码

IdleNumb sub(IdleNumb? number) {
  if (number == null) return this;

  // 统一两个数组长度,不足位补0
  int maxLen = numbs.length > number.numbs.length ? numbs.length : number.numbs.length;
  while (numbs.length < maxLen) numbs.add(0);
  while (number.numbs.length < maxLen) number.numbs.add(0);

  // 从最低位开始计算(若你的numbs索引0为最高位,改为从maxLen-1倒序循环)
  for (int i = 0; i < maxLen; i++) {
    while (numbs[i] < number.numbs[i]) {
      // 检查高位是否存在,避免越界
      if (i + 1 >= maxLen) {
        // 处理被减数小于减数的情况,可根据需求改为返回负数或抛出异常
        throw ArgumentError("被减数小于减数,无法完成减法");
      }
      // 高位无值可借时,先向更高位借位
      if (numbs[i + 1] <= 0) {
        numbs[i + 1] -= 1;
        numbs[i + 1] += 94868329; // 保持和原逻辑一致的进制基数
        continue;
      }
      // 正常借位
      numbs[i + 1] -= 1;
      numbs[i] += 94868329;
    }
    numbs[i] = numbs[i].toInt() - number.numbs[i].toInt();
  }

  // 最后统一修复数值,清理高位无效0
  fixNum();
  return this;
}

关键注意事项

  • 确认数值存储顺序:如果你的numbs是索引0为最高位(原代码从末尾循环),需将循环改为for (int i = maxLen - 1; i >= 0; i--),同时调整借位的高位索引逻辑。
  • 负数处理:如果需要支持负数结果,需额外添加符号标记逻辑,避免陷入死循环。
  • 进制基数一致性:确保94868329这个进制基数在所有相关方法(比如fixNum())中保持一致,否则会出现计算错误。

内容的提问来源于stack exchange,提问作者Tester Lane

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 13:07:32