Java displayWord方法进入if分支但字符数组赋值后全为问号
问题原因
你的内层循环逻辑存在值覆盖错误:每次内层j循环匹配失败时,else分支都会把displayedWord[i]重置为?。哪怕当前位置i已经在之前的j循环中匹配成功、被赋值为正确字符,只要后续j轮次匹配失败,正确的赋值就会被问号覆盖。
这也是为什么你能看到if块内的打印语句——代码确实进入过匹配成功的分支,但后续的循环步骤把正确值覆盖掉了。举个实际运行的例子:
假设wordArray[i] = 'h',correctGuesses = ['h', 'e', 'l']:
- j=0时匹配成功:
displayedWord[i]被赋值为'h',打印"they are the same" - j=1时字符对比不相等:触发else,
displayedWord[i]被改成'?' - j=2时字符对比不相等:再次触发else,
displayedWord[i]保持为'?'
内层循环走完后,该位置最终还是问号。
修复方法
核心思路是:不要在内层循环里反复给displayedWord[i]赋问号,只在匹配成功时更新值即可,可选两种实现:
- 方案1:初始化数组时先把所有位置填充为问号,内层循环只处理匹配成功的逻辑,匹配到后直接break跳出内层循环,避免多余遍历:
// 注意使用Arrays.fill需要导入java.util.Arrays import java.util.Arrays; public static void displayWord(char[] correctGuesses, char[] wordArray) { char[] displayedWord = new char[wordArray.length]; // 初始化所有位置为问号 Arrays.fill(displayedWord, '?'); for(int i = 0; i < wordArray.length; i++) { for(int j = 0; j < correctGuesses.length; j++) { if(wordArray[i] == correctGuesses[j]) { displayedWord[i] = wordArray[i]; System.out.println("they are the same"); break; // 匹配成功就不用检查剩余猜测字符 } } } for(char c : displayedWord) { System.out.print(c); } }
- 方案2:不想导包的话,在外层i循环开始时先给当前位置设为问号,内层循环同样匹配成功就赋值+break:
public static void displayWord(char[] correctGuesses, char[] wordArray) { char[] displayedWord = new char[wordArray.length]; for(int i = 0; i < wordArray.length; i++) { displayedWord[i] = '?'; for(int j = 0; j < correctGuesses.length; j++) { if(wordArray[i] == correctGuesses[j]) { displayedWord[i] = wordArray[i]; System.out.println("they are the same"); break; } } } for(char c : displayedWord) { System.out.print(c); } }
内容的提问来源于stack exchange,提问作者MouseWarrior
相关产品推荐
相关产品推荐

