Java餐厅选择器程序InputMismatchException错误修复咨询
解决Java餐厅选择器的InputMismatchException问题
嘿,这个问题我太熟了!你碰到的InputMismatchException其实是个很常见的小坑,咱们来一步步拆解并修复它:
问题根源
你的程序提示用户输入yes或no,但代码里用了scnr.nextBoolean()——这个方法只认严格的true或false字符串,当用户输入yes/no时,Scanner没法把它转换成布尔值,直接就抛出异常了。
两种修复方案
方案1:简单调整输入提示(最快实现)
直接把提示文本改成让用户输入true或false,这样nextBoolean()就能正常工作,代码改动最小:
import java.util.Scanner; public class ABaybayanAssignment3 { public static void main(String[]args) { Scanner scnr = new Scanner(System.in); System.out.println("Type true or false for the following questions:"); System.out.println("Is anyone in your party vegetarian?"); boolean vegetarian = scnr.nextBoolean(); // 变量名改成驼峰更规范哦 System.out.println("Is anyone in your party vegan?"); boolean vegan = scnr.nextBoolean(); System.out.println("Is anyone in your party gluten free?"); boolean glutenFree = scnr.nextBoolean(); System.out.println("Here are your restaurant choices:"); if(vegetarian || vegan || glutenFree ) { System.out.println("Corner Cafe"); } if(!vegetarian && !vegan && !glutenFree) { System.out.println("Joe's Gourmet Burgers"); } if(!vegan) { System.out.println("Main Street Pizza Company"); } if(!vegan && !glutenFree) { System.out.println("Mama's Fine Italian"); } } }
方案2:保留yes/no输入(更友好)
如果想让用户继续用yes/no输入,那就得先接收字符串,再手动转换成布尔值,还能加个输入验证防止用户瞎输:
import java.util.Scanner; public class ABaybayanAssignment3 { public static void main(String[]args) { Scanner scnr = new Scanner(System.in); System.out.println("Type yes or no for the following questions:"); // 处理素食者问题,带输入验证 System.out.println("Is anyone in your party vegetarian?"); String vegInput = scnr.next().toLowerCase(); while (!vegInput.equals("yes") && !vegInput.equals("no")) { System.out.println("Invalid input, please type yes or no:"); vegInput = scnr.next().toLowerCase(); } boolean vegetarian = vegInput.equals("yes"); // 处理纯素食者问题 System.out.println("Is anyone in your party vegan?"); String veganInput = scnr.next().toLowerCase(); while (!veganInput.equals("yes") && !veganInput.equals("no")) { System.out.println("Invalid input, please type yes or no:"); veganInput = scnr.next().toLowerCase(); } boolean vegan = veganInput.equals("yes"); // 处理无麸质问题 System.out.println("Is anyone in your party gluten free?"); String gfInput = scnr.next().toLowerCase(); while (!gfInput.equals("yes") && !gfInput.equals("no")) { System.out.println("Invalid input, please type yes or no:"); gfInput = scnr.next().toLowerCase(); } boolean glutenFree = gfInput.equals("yes"); // 输出餐厅推荐 System.out.println("Here are your restaurant choices:"); if(vegetarian || vegan || glutenFree ) { System.out.println("Corner Cafe"); } if(!vegetarian && !vegan && !glutenFree) { System.out.println("Joe's Gourmet Burgers"); } if(!vegan) { System.out.println("Main Street Pizza Company"); } if(!vegan && !glutenFree) { System.out.println("Mama's Fine Italian"); } } }
额外小建议
- 变量名遵循Java的驼峰命名法:把你原来的
Vegetarian改成vegetarian,这是行业通用的编码规范,可读性更强。 - 要是觉得重复的输入验证代码太啰嗦,可以把它封装成一个单独的方法,比如
private static boolean getYesNoAnswer(Scanner scnr, String question),这样代码会更整洁。
内容的提问来源于stack exchange,提问作者short_string
相关产品推荐
相关产品推荐

