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

当用户输入错误值时,如何循环执行switch case结构?

嘿,这问题好办!要让用户输入错误角色名时重复执行选择流程,咱们只需要用循环结构把角色选择的逻辑包裹起来,每次输入后检查合法性,不合法就重来。下面给你具体的实现方案:

核心思路

  1. 先把所有有效的角色名存到一个集合里(比如HashSet),这样能快速判断用户输入是否合法。
  2. 用do-while循环(因为咱们需要至少执行一次选择流程),把角色列表展示、输入获取、合法性检查的逻辑都放进去。
  3. 只有当用户输入的角色名在有效集合里时,才跳出循环,执行后续的switch逻辑。

修改后的完整代码

import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class CharacterSelector {
    private static Scanner sc = new Scanner(System.in);
    private static String characterClass;

    public static int selectClass() {
        // 角色列表(修正了Rouge的拼写错误,正确应为Rogue)
        String[] chaName = {"Wizard", "Sorcerer", "Monk", "Cleric", "Warlock", "Druid", "Rogue", "Bard", "Fighter", "Ranger", "Paladin", "Barbarian"};
        int[] characterDiceValue = {6, 6, 8, 8, 8, 8, 8, 8, 10, 10, 10, 12};
        // 把有效角色名存入Set,方便快速校验
        Set<String> validCharacterClasses = new HashSet<>(Arrays.asList(chaName));
        
        do {
            // 展示角色选择界面
            System.out.println("Character Types");
            Arrays.stream(chaName).forEach(System.out::println);
            System.out.println("Select a Character name from the given list above");
            
            // 获取输入并去除前后空格,避免空格导致匹配失败
            characterClass = sc.next().trim();
            
            // 校验输入是否合法
            if (!validCharacterClasses.contains(characterClass)) {
                System.out.println("Oops! That's not a valid character class. Please try again.");
            }
        } while (!validCharacterClasses.contains(characterClass)); // 输入无效就循环
        
        // 执行switch逻辑,返回对应的生命值骰子值
        switch(characterClass) {
            case "Wizard":
                return characterDiceValue[0];
            case "Sorcerer":
                return characterDiceValue[1];
            case "Monk":
                return characterDiceValue[2];
            case "Cleric":
                return characterDiceValue[3];
            case "Warlock":
                return characterDiceValue[4];
            case "Druid":
                return characterDiceValue[5];
            case "Rogue":
                return characterDiceValue[6];
            case "Bard":
                return characterDiceValue[7];
            case "Fighter":
                return characterDiceValue[8];
            case "Ranger":
                return characterDiceValue[9];
            case "Paladin":
                return characterDiceValue[10];
            case "Barbarian":
                return characterDiceValue[11];
            default:
                // 这里理论上不会触发,因为前面已经做了合法性校验
                return -1;
        }
    }

    public static void main(String[] args) {
        int hitDice = selectClass();
        System.out.printf("You selected %s, your hit dice is d%d%n", characterClass, hitDice);
    }
}

关键细节说明

  • do-while循环的优势:它会先执行一次循环体里的内容(展示角色列表、获取输入),再判断是否需要继续循环,完美符合“先让用户选,不对就重来”的需求。
  • HashSet校验合法性:相比遍历数组检查,HashSet的contains()方法是O(1)的时间复杂度,效率更高,尤其是角色数量多的时候。
  • trim()处理输入:避免用户不小心输入前后空格(比如" Wizard ")导致匹配失败,提升用户体验。
  • 修正拼写错误:你原来的代码里把盗贼写成了Rouge,正确的拼写是Rogue,不然用户输入正确的角色名也会被判定为无效哦~

内容的提问来源于stack exchange,提问作者DDSasikala

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:59:27