两个相似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:
- 查找终止密码子得到有效索引(比如测试字符串中TAA在索引6)
- 计算差值
diff = 6 - (-1) =7,7%3≠0,进入else分支 - 从索引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
相关产品推荐
相关产品推荐

