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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 22:13:11