Java救援动物系统:intakeNewDog/Monkey输入验证失效求助
问题根源与修复方案
核心问题:Scanner缓冲区残留换行符
在main方法中,使用scnr.next().charAt(0)读取菜单选择时,只会读取输入的单个字符,不会消耗掉输入末尾的换行符。当进入intakeNewDog或intakeNewMonkey方法后,第一个scanner.nextLine()会直接读取到这个残留的换行符,导致name变量为空字符串,后续的同名验证循环自然无法匹配到已存在的动物名称,直接跳过验证逻辑继续执行后续代码。
同时,intakeNewDog和intakeNewMonkey方法中在验证完名字后多写了一行scanner.nextLine(),会额外消耗一次输入,导致后续用户输入的内容错位。
具体修复步骤
1. 清理main方法中的Scanner缓冲区
在读取完菜单选择的字符后,添加一行代码清除残留的换行符:
userSelection = scnr.next().charAt(0); //users menu selection input scnr.nextLine(); // 新增:清除缓冲区中剩余的换行符
2. 修正intakeNewDog方法
移除验证名字后多余的scanner.nextLine(),确保读取名字的逻辑正确:
public static void intakeNewDog(Scanner scanner) { String name; System.out.println("What is the dog's name?"); name = scanner.nextLine(); // 此时能正确获取用户输入的名字 for(Dog dog: dogList) { if(dog.getName().equalsIgnoreCase(name)) { System.out.println("\n\nThis dog is already in our system\n\n"); return; } } // 移除多余的scanner.nextLine() // 后续输入逻辑正常执行 System.out.println("What is the dog's breed?"); String breed = scanner.nextLine(); // ... 其余原有代码保持不变 }
3. 修正intakeNewMonkey方法
同样移除验证名字后多余的scanner.nextLine():
public static void intakeNewMonkey(Scanner scanner) { ArrayList<String> allowedMonkeysList = new ArrayList<String>(); allowedMonkeysList.add("Capuchin"); allowedMonkeysList.add("Guenon"); allowedMonkeysList.add("Macaque"); allowedMonkeysList.add("Marmoset"); allowedMonkeysList.add("Squirrel Monkey"); allowedMonkeysList.add("Tamarin"); System.out.println("What is the monkey's name?"); String name = scanner.nextLine(); for(Monkey monkey: monkeyList) { if(monkey.getName().equalsIgnoreCase(name)) { System.out.println("\n\nThis monkey is already in our system\n\n"); return; } } // 移除多余的scanner.nextLine() System.out.println("What is the monkey's species?"); String species = scanner.nextLine(); // ... 其余原有代码保持不变 }
4. 可选优化:为ArrayList添加泛型
原始代码中的dogList和monkeyList未指定泛型,会导致编译警告且存在类型转换风险,建议修改为:
private static ArrayList<Dog> dogList = new ArrayList<>(); private static ArrayList<Monkey> monkeyList = new ArrayList<>();
测试验证
修复后,当输入已存在的动物名称(比如"Spot"),程序会正确提示"This dog is already in our system"并返回菜单,不会继续执行后续的输入逻辑。
内容的提问来源于stack exchange,提问作者William
相关产品推荐
相关产品推荐

