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

两个相似Java方法一正常运行一无法执行的问题求助

问题排查:countAllGenes方法无输出的原因

问题描述

同一类中的countAllGenes与printAllGenes方法逻辑高度相似,仅返回类型和计数变量不同,但countAllGenes编译通过后在BlueJ无法运行、Eclipse控制台无输出;printAllGenes看似可正常输出,实则存在隐藏的死循环隐患。

核心bug分析

问题根源在findStopCodon方法的else分支:

else {
    currIndex = dna.indexOf(stopCodon, currIndex);   
}

当找到的终止密码子位置与起始索引的差值不是3的倍数时,代码从当前currIndex位置重复查找,而非跳过当前终止密码子(从currIndex + stopCodon.length()开始)。这会触发死循环:每次都会定位到同一个终止密码子,永远无法退出循环。

触发路径

当findGene方法找不到ATG时(即startIndex = -1),调用findStopCodon会传入startIndex=-1:

  1. 查找终止密码子得到有效索引(比如测试字符串中TAA在索引6)
  2. 计算差值diff = 6 - (-1) =7,7%3≠0,进入else分支
  3. 从索引6重新查找TAA,依然得到索引6,循环往复无法退出

countAllGenes执行到第四次循环时,startIndex=33(超出字符串长度),findGene返回-1的startIndex,触发上述死循环,导致方法卡死,无法输出后续内容。

修复方案

修改findStopCodon的else分支,跳过当前找到的终止密码子:

else {
    currIndex = dna.indexOf(stopCodon, currIndex + stopCodon.length());   
}

修改后,每次查找都会从当前终止密码子的下一个位置开始,避免重复定位同一位置,解决死循环问题。

修复完成后,countAllGenes方法会正常执行,控制台将输出:

0
9
9
21
21
33
3

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 03:20:12