我对java和一般的编码都很陌生,我正试图弄明白如何让这个游戏在学校的一个项目中发挥作用。它的意思是让你输入一个月,然后它会要求你选择一天,但是当我输入一个月时,它总是说这是一个无效的输入,这是我希望它做的,当它不是一个有效的月份。我做错了什么?
import java.util.*;
class Main {
public static void main(String[] args) {
boolean game = true;
do {
System.out.println("Welcome to the Famous Date game!");
System.out.println("Please choose a month");
Scanner Month = new Scanner(System.in);
String Choice = Month.nextLine();
String[] Months = {"January", "February", "March", "April", "May", "June","July",
"August","September","October","November", "December"};
List<String> mylist = Arrays.asList(Months);
if (Choice.equals(mylist)) {
System.out.println("Please choose a day");
}
else
System.out.println("That is not a valid month");
}
while (game=true);
}
}
如果允许使用java中的类。时间包,然后你可以使用月(这是一个枚举)。这样你就不用创建自己的列表了。
此外,在用户选择一个月后,她需要选择一个日子。我假设用户应该输入一个有效的日子,例如,当输入的月份是二月时,输入数字30将构成无效的日子。为了检查输入的日子是否有效,您可以使用类YearMonth,它有一个返回每个月天数的方法,并考虑到闰年。请参考这个SO问题:特定年份的特定月份的天数?
下面是一个SSCCE
(代码后面的注释)
import java.time.LocalDate;
import java.time.Month;
import java.time.YearMonth;
import java.time.temporal.ChronoField;
import java.util.InputMismatchException;
import java.util.Scanner;
public class GameMain {
public static void main(String[] args) {
int year = LocalDate.now().get(ChronoField.YEAR);
Scanner keyboard = new Scanner(System.in);
boolean game = true;
do {
System.out.print("Please choose a month: ");
String month = keyboard.nextLine();
try {
Month theMonth = Month.valueOf(month.toUpperCase());
YearMonth daysInMonth = YearMonth.of(year, theMonth);
do {
System.out.print("Please choose a day: ");
try {
int day = keyboard.nextInt();
keyboard.nextLine();
if (day < 0 || day > daysInMonth.lengthOfMonth()) {
System.out.printf("%s does not have %d days.%n", theMonth, day);
}
else {
game = false;
}
}
catch (InputMismatchException xInputMismatch) {
System.out.println("Please enter a number.");
}
} while (game);
}
catch (IllegalArgumentException xIllegalArgument) {
System.out.println("That is not a valid month");
}
} while (game);
}
}
请注意,在这一行之后(来自上述代码):
int day = keyboard.nextInt();
有这样一句话:
keyboard.nextLine();
请参阅此SO问题,了解原因:扫描仪在使用Next()或nextFoo()后跳过nextLine()?
还要注意的是,您只需要创建一次扫描仪
。在问题中的代码中,您在do while
循环的每次迭代中都创建了一个扫描仪。
此外,如果您输入的值不存在于
enum
中,则会抛出IllegalArgumentExctive。
如果输入的值不是整数,则方法nextInt
会抛出InputMismatchExctive
。
使用if(mylist.contains(选择))工作!非常感谢
尝试测试是否包含月份list.contains()
和其他方法中的天数
我是不是遗漏了什么,或者有什么特别的原因不起作用? 谢了!
问题内容: 打开GUI窗口之前,从命令行获取输入时遇到了一些麻烦。我之前在Apple Exchange上问过这个问题,但是在我们确定这是一个编程问题后才发送到这里。基本上,在打开窗口之前,我正在运行扫描仪以获取用户输入,但它会启动程序,在Mac上切换空间,然后必须切换回带有终端的工作区才能回答问题。这是原始问题的链接。 https://apple.stackexchange.com/questio
它在do while循环内的第三行崩溃,不等待我的输入: 堆栈跟踪: 线程“main”java中出现异常。util。非接触性异常 在爪哇。util。扫描仪。throwFor(未知来源) 在爪哇。util。扫描仪。下一个(未知源) java.util.canner.next国际(来源不明) java.util.canner.next国际(来源不明) 在主。river.main(river.java:
我想用Android智能手机和inbuild指纹硬件创建一个考勤应用程序,因为很少有主管会在他们的Android智能手机上安装应用程序。他们将使用智能手机注册新用户的手指数据,他们必须以字节码或其他格式上传到服务器上,每当员工使用应用程序登录时,通过向服务器发送扫描的字节码或其他格式的数据,将手指与服务器进行检查,以比较授权用户并使其登录 我正在查看这些文档https://developer.an
我想读取一个文本文件,并将每一行放入一个字符串(字符串数组)。然而,这需要扫描文件两次,一次是为了找出有多少行,另一次是为了创建一个这样大小的字符串数组。但它抛出了一个错误,重置方法似乎不起作用。 这是相关的代码片段。
问题内容: 我的程序中有一个扫描仪,可以读取文件的一部分并将其格式化为HTML。当我读取文件时,我需要知道如何使扫描仪知道它在一行的末尾,然后开始写入下一行。 这是代码的相关部分,让我知道是否遗漏了什么: 我发现了有关,但是我仍然不知道如何确定何时到达终点。 问题答案: 如果只想使用Scanner,则需要创建一个临时字符串,将其实例化到数据网格的nextLine()(因此它仅返回跳过的行),并创建