Java 我应该如何处理无效的用户输入?
对于我的餐馆选择器程序,我需要编写一个使用决策结构的程序。注意:在编译和运行它时,我遇到了一些错误,例如:Java 我应该如何处理无效的用户输入?,java,Java,对于我的餐馆选择器程序,我需要编写一个使用决策结构的程序。注意:在编译和运行它时,我遇到了一些错误,例如: Exception in thread "main" java.util.InputMismatchException at java.base/java.util.Scanner.throwFor(Scanner.java:939) at java.base/java.util.Scanner.next(Scanner.java:1594) at java
Exception in thread "main" java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Scanner.java:939)
at java.base/java.util.Scanner.next(Scanner.java:1594)
at java.base/java.util.Scanner.nextBoolean(Scanner.java:1893)
at ABaybayanAssignment3.main(ABaybayanAssignment3.java:12)
我想知道我能对我的代码做些什么来修复它。我的代码可以在下面找到
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?");
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");
}
}
}
程序编译和运行时没有任何错误 程序的问题是,在运行时将
yes
和no
分配给布尔变量vegean
,vegan
,glunfree
,这是错误的
<强>也不同于C++,java中的布尔值不能赋给< < />强> ->仅<强>真< <强> >或<强> false <强> >
此外,改变System.out.println("Type yes or no for the following questions:");
到
我认为主要的问题是您不能处理无效的输入错误。最好捕获这些异常并提示用户输入有效的输入。或者,您还可以添加一个默认值,在用户未输入任何内容的情况下,将布尔值设置为该值(当然,在程序开始时指定该值) 类似这样的内容应该有助于传达我的意思:
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:");
boolean Vegetarian = requestBooleanInput(scnr,"Is anyone in your party vegetarian?" );
boolean vegan = requestBooleanInput(scnr,"Is anyone in your party vegan?");
boolean glutenFree = requestBooleanInput(scnr,"Is anyone in your party gluten free?");
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");
}
}
public static boolean requestBooleanInput(Scanner scanner, String message){
boolean value = false;
boolean validInput = false;
while (!validInput){
System.out.println(message);
try {
value = scanner.nextBoolean();
validInput = true;
} catch (Exception e) {
System.out.println("You entered an invalid input '"+scanner.next()+"', please enter only 'true' or 'false'");
}
}
return value;
}
}
我对你的计划有一个解决方案。我使用了布尔值和
真/假
而不是是/否
。两者在逻辑上是相同的。这是我的节目
public class testing {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Type true or false for the following questions:");
System.out.println("Is anyone in your party vegetarian?\n");
boolean Vegetarian = sc.nextBoolean();
System.out.println("Is anyone in your party vegan?\n");
boolean vegan = sc.nextBoolean();
System.out.println("Is anyone in your party gluten free?\n");
boolean glutenFree = sc.nextBoolean();
System.out.println("Here are your restaurant choices:");
if(Vegetarian == true && vegan == true && glutenFree == true) {
System.out.println("Corner Cafe");
} else if(Vegetarian == false && vegan == false && glutenFree == false) {
System.out.println("Joe's Gourmet Burgers");
} else if(vegan == false) {
System.out.println("Main Street Pizza Company");
} else if(vegan == false && glutenFree == false) {
System.out.println("Mama's Fine Italian");
}
}
}
我的输出显示了这一点
Type true or false for the following questions:
Is anyone in your party vegetarian?
true
Is anyone in your party vegan?
true
Is anyone in your party gluten free?
true
Here are your restaurant choices:
Corner Cafe
我已经改变了一点程序,当然是为了让它更容易。由于使用了Boolean,因此唯一的选项是true或false。除此之外,if-else验证也被修改为abit,以补充
true/false
输入。因此,我希望这能回答您的问题->InputMismatchException-如果调用.nextBoolean()
(堆栈跟踪中指示的一个)时,下一个标记不是有效的布尔值,那么其中有一些值不是字符串“true”或“false”。停止输入非布尔值:)调用scnr.nextBoolean()
时,下一步键入的内容必须是单词“true”或单词“false”(大写不重要)-nextBoolean()不接受单词“Yes”或“No”。尽管有最新的答案建议,但它向您展示了如何使程序使用布尔值,询问您的问题并期望某人键入true
或false
将是一种糟糕的用户体验。当与用户交互(而不是从文件中读取)时,通常需要使用scanner.nextLine()
获取字符串,然后对其进行解释<代码>字符串响应=scnr.nextLine();if(response.equalsIgnoreCase(“yes”)| | response.equalsIgnoreCase(“y”){…}
Type true or false for the following questions:
Is anyone in your party vegetarian?
true
Is anyone in your party vegan?
true
Is anyone in your party gluten free?
true
Here are your restaurant choices:
Corner Cafe