Java中多次校验ArrayList用户输入的代码异常排查与修复
问题排查与修复方案
先帮你拆解下代码里的核心问题:
- 逻辑结构混乱:你把三次输入的校验混在同一个遍历
forwards的循环里,导致只要遍历到一个不匹配的前锋,就会直接触发错误提示,而不是先完整检查输入是否存在于列表中。 - 输入校验顺序错误:你没有先验证第一次输入是否有效,就直接开始处理第二次输入;而且
userInput2初始是空字符串,第一次遍历的时候会触发userInput2.equals(i)的判断,这完全是无意义的(用户还没输入第二个名字)。 - break/continue使用不当:for循环里的break只会跳出当前的for遍历,之后会立刻执行外面的错误提示代码,不管你的输入是否正确。
修复后的代码
我们重新梳理逻辑:分三次获取输入,每次都先校验输入是否在前锋列表里,直到用户输入有效名字为止,最后输出选中的三人组。
import java.util.ArrayList; import java.util.Scanner; public class ForwardPicker { public static void main(String[] args) { ArrayList<String> forwards = new ArrayList<>(); forwards.add("Matthew Barzal"); forwards.add("Josh Bailey"); forwards.add("Anthony Beauvillier"); forwards.add("Kieffer Bellows"); forwards.add("Casey Cizikas"); forwards.add("Cal Clutterbuck"); forwards.add("Anders Lee"); forwards.add("Matt Martin"); forwards.add("Brock Nelson"); forwards.add("Oliver Wahlstrom"); forwards.add("Zach Parise"); forwards.add("Kyle Palmieri"); forwards.add("JG Pageau"); // 打印前锋列表 System.out.println("These are your available forwards:"); for (String forward : forwards) { System.out.println(forward); } System.out.println("\nPlease pick three(3) forwards to form Line #1:"); Scanner input = new Scanner(System.in); ArrayList<String> line1 = new ArrayList<>(); // 循环三次,获取三个有效输入 while (line1.size() < 3) { System.out.printf("Enter forward #%d: ", line1.size() + 1); String userInput = input.nextLine().trim(); // 去掉前后空格,避免输入空格导致的不匹配 if (forwards.contains(userInput)) { if (!line1.contains(userInput)) { // 额外校验:避免重复选择同一个球员 line1.add(userInput); System.out.println("Added successfully!"); } else { System.out.println("You already picked this forward. Choose another one."); } } else { System.out.println("Error: That forward is not in the list. Try again."); } } // 输出最终结果 System.out.println("\nYour forwards for Line #1 are:"); for (int i = 0; i < line1.size(); i++) { System.out.printf("%d. %s%n", i + 1, line1.get(i)); } input.close(); } }
关键改进点
- 模块化校验:用一个while循环控制获取3个有效输入,每次输入后先检查是否在前锋列表中,再检查是否重复选择,逻辑清晰。
- 避免无效判断:不再初始化空字符串的输入变量,而是每次获取输入后立即校验。
- 用户体验优化:添加了输入提示(比如
Enter forward #1),还处理了输入前后空格的问题,避免用户不小心输入空格导致匹配失败。 - 重复选择防护:额外增加了校验,防止用户重复选择同一个前锋,符合实际需求。
- 代码可读性:用增强for循环遍历列表,变量命名更清晰,结构更易维护。
原代码错误点的具体解释
你之前的代码里,当输入错误的名字时,遍历forwards列表的每一个元素都找不到匹配项,for循环结束后就会执行System.out.println("I am outside everything"),然后重新获取userInput——这完全打乱了三次输入的流程:比如第一次输入错误,应该提示用户重新输入第一次的名字,而不是直接跳到处理第二次输入的逻辑里。
内容的提问来源于stack exchange,提问作者Kiznet007
相关产品推荐
相关产品推荐

