当用户输入错误值时,如何循环执行switch case结构?
嘿,这问题好办!要让用户输入错误角色名时重复执行选择流程,咱们只需要用循环结构把角色选择的逻辑包裹起来,每次输入后检查合法性,不合法就重来。下面给你具体的实现方案:
核心思路
- 先把所有有效的角色名存到一个集合里(比如
HashSet),这样能快速判断用户输入是否合法。 - 用
do-while循环(因为咱们需要至少执行一次选择流程),把角色列表展示、输入获取、合法性检查的逻辑都放进去。 - 只有当用户输入的角色名在有效集合里时,才跳出循环,执行后续的
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
相关产品推荐
相关产品推荐

