自定义IdleNumb类的sub方法导致Android应用崩溃求助
解决IdleNumb类sub方法导致Android模拟器冻结崩溃的问题
问题根源分析
你的sub方法存在三个致命问题,直接引发模拟器冻结或崩溃:
- 数组索引越界:
- 当循环到
numbs的最后一个索引时,执行numbs[i + 1] -= 1会访问超出数组长度的位置,触发未捕获的数组越界异常。 - 如果
number.numbs的长度大于当前实例的numbs长度,循环索引i会覆盖到当前numbs不存在的位置,同样引发越界。
- 当循环到
- 无限死循环:
while (numbs[i] < number.numbs[i])的借位逻辑未处理高位无值可借的情况。比如当高位已经是0或负数时,反复执行借位操作后,numbs[i]可能仍然小于number.numbs[i],导致循环无限执行,CPU被占满,模拟器直接冻结,无法输出调试信息。
- 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
相关产品推荐
相关产品推荐

