循环内修改外部int变量失效致while无限循环问题求助
循环无限执行的原因及修复方案
核心问题:循环内未更新查找位置
你代码里的leftAngleBracketLocation和rightAngleBracketLocation只在循环外初始化了一次,循环过程中只是更新了leftAngleIndex和rightAngleIndex,但没有重新调用indexOf()去获取新的括号位置。这就导致这两个变量永远是第一次找到的位置,只要初始文本里有<,leftAngleBracketLocation就不会变成-1,循环自然停不下来。
额外问题:右括号匹配逻辑错误
当前找右括号是从rightAngleIndex(初始为0)开始查找,这会导致如果文本前面有无关的>,会错误匹配到那个位置,而不是当前<对应的>。正确的做法应该是从当前<的位置之后开始查找>。
修复后的代码
/** * 该方法接收输入短语,替换所有非终结符直到全部替换完成 * * @param phrase * @return 最终短语 */ private static String buildPhrase(String phrase) { StringBuilder finalPhrase = new StringBuilder(); StringBuilder nonTerminal = new StringBuilder(); int start = 0; int end = phrase.length(); // 初始查找第一个<的位置 int leftAngleBracketLocation = phrase.indexOf("<", start); // 循环查找所有非终结符 while (leftAngleBracketLocation != -1) { // 找到当前<对应的>,从<的位置之后开始找 int rightAngleBracketLocation = phrase.indexOf(">", leftAngleBracketLocation); // 如果找不到对应的>,终止循环(避免异常) if (rightAngleBracketLocation == -1) { break; } // 追加<之前的内容 finalPhrase.append(phrase, start, leftAngleBracketLocation); // 提取当前非终结符(这里可以根据需求处理,比如替换成对应终结符) nonTerminal.setLength(0); // 清空之前的非终结符 nonTerminal.append(phrase, leftAngleBracketLocation + 1, rightAngleBracketLocation); // 示例:这里假设你需要把非终结符替换成某个值,实际根据你的逻辑修改 finalPhrase.append(nonTerminal); // 更新下一次查找的起始位置,跳过当前的> start = rightAngleBracketLocation + 1; // 查找下一个<的位置 leftAngleBracketLocation = phrase.indexOf("<", start); } // 追加最后一个>之后的剩余内容 finalPhrase.append(phrase, start, end); return finalPhrase.toString(); }
关键修改说明
- 把
rightAngleBracketLocation的查找移到循环内部,并且从当前leftAngleBracketLocation之后开始查找,确保匹配正确的<>对 - 每次循环结束后,重新调用
indexOf()更新leftAngleBracketLocation的位置,确保能找到下一个<或者变成-1终止循环 - 更新
start变量到当前>的下一个位置,避免重复处理内容 - 每次处理非终结符前清空
nonTerminal,避免累积旧内容 - 增加了找不到对应
>时的终止逻辑,防止数组越界异常
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

