所以我使用getRangedInt方法来计算用户的出生月份和日期,以及用于用户输入的Scanner。如果他们选择二月(提示要求用户输入他们的出生月份,所以是1-12),那么我需要将该月的最大天数更改为28天(其他有30天的月份依此类推)。我试图使用开关来对月份进行分类,但是当程序运行时,它只是跳过,并且从未调用该方法。该方法本身可以很好地用于其他示例。我错过了什么?
switch (daysInMonth)
{
case "1":
case "3":
case "5":
case "7":
case "8":
case "10":
case "12":
int birthDay = getRangedInt(input,"Enter your birth day: ",1,31);
break;
case "2":
birthDay = getRangedInt(input,"Enter your birth day: ",1,28);
break;
case "4":
case "6":
case "9":
case "11":
birthDay = getRangedInt(input,"Enter your birth day: ",1,30);
}
如果您读取daysInMonth作为整数,那么所有的测试用例将
为假,因为您正在检查字符串值,case "1"检查
string "1",而case 1:将检查是否为整数。
-
在进入
switch
语句之前声明birthDay
。这个想法是,您希望在访问一个(且只有一个)case时设置此值。 -
根据您对
daysInMonth
的定义,您可能会在未处理的default
情况下结束。您应该考虑如何定义和约束开关控制变量(可能使用enum),这样您就不能有默认情况。 -
确保
daysInMonth
是字符串,并且.equals()
的情况下所做的是你所期望的。我不确定像这样的编译时错误不匹配会引起什么,但肯定一个好的IDE会警告你。
你的抽象层次是错误的。
你不应该在交换机中调用getRangedInt()
。相反,您应该使用一个名为getNumberOfDays()
的方法,该方法接受选择月份的输入(可以是字符串,如"January","February",或int或enum)。第二种方法可以使用其中的开关;但你不应该换到其他地方。推理:关于一个月有多少人的知识应该只存在于一个地方。在您的解决方案中,您需要在每个地方使用相同的开关来处理"每月的天数"。导致代码重复,无论如何都要避免。
然后使用其他方法的返回值调用方法getRangedInt()