【问题标题】:how do I solve a switch case bug in Java?如何解决 Java 中的 switch case 错误?
【发布时间】:2021-06-08 16:06:11
【问题描述】:

问题是这样的:

创建一个 while 循环,该循环将使用一个计数器执行 12 次以下代码,该计数器从 1 开始,每次循环递增 1。

在 while 循环中,创建一个 switch 语句,该语句将打印出一年中每个月份的天数。 使用贯穿功能,以便您只有一份包含 31 天的所有月份的打印报表。不用担心闰年。

也打印出月份的名称。您可以复制并粘贴上一个实验室中的月份名称数组,以帮助简化此操作。

这是我的答案:

int numOfMonth = 1;
String[] months ={
    "January", "February", "March", "April", "May", "June", "July",
    "August" , "September" , "October" , "November", "December"};
int[] daysOfMonths = {28, 30, 31};

// String output;

    while(numOfMonth++ <= 12){
        int index = numOfMonth -1;

        switch(numOfMonth){
            case 2:
                System.out.println(months[index] + " has " + daysOfMonths[0] + " Days.");
                break;

            case 4:
            case 6:
            case 9:
            case 11:
                System.out.println(months[index] + " has " + daysOfMonths[1] + " Days.");
                break;
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                System.out.println(months[index] + " has " + daysOfMonths[2] + " Days.");
                break;
            default:
                break;
        }
    }

此代码正确输出所有其他值,但不输出一月。

请问,我该怎么办?

【问题讨论】:

  • 问题是在循环顶部增加 numOfMonth,然后再使用它:while(numOfMonth++ &lt;= 12){...}。一种解决方案是将“while”更改为“do”循环。另一种解决方案是更改为while(numOfMonth &lt;= 12),并将numOfMonth++ 移动到循环的底部。
  • numOfMonth++ 将在您输入switch 之前增加您的变量,因此它永远不会是1。切换后进行增量。
  • 您可以改用索引变量。这将使您的数组和开关大小写保持一致。

标签: java switch-statement


【解决方案1】:

使用for 循环而不是while 循环:

for (int i=1; i <= numOfMonth; ++i) {
    int index = i - 1;

    switch (i) {
        // current switch statement
    }
}

while 循环的问题是,在循环 evem 的第一次迭代开始之前,后缀会增加 numOfMonth 到 2:

while(numOfMonth++ <= 12){

因此,一月总是会被跳过。

【讨论】:

  • 这项任务似乎特别需要while。在这种情况下,do/while 可能是可以接受的。或者增加循环体​​中的计数器而不是条件。或者至少将初始值偏移 -1 :)
  • @SergioTulentsev 我不同意,我认为您阅读代码不正确。 while 循环显然似乎在一年中的 12 个月内迭代,switch 语句及其 12 个条件似乎证实了这一点。
  • 是的,有十二个条件,但正如您正确指出的那样,第一个条件被跳过了。我的所有三个建议都纠正了这一点。示例:pastebin.com/raw/nt50SrLt
  • 也不确定你到底不同意什么。
  • @SergioTulentsev 我实际上是爱尔兰公民,信不信由你。是通过我 100 年前出生在科克郡的外祖母捡来的。
【解决方案2】:

将 numOfMonth 的递增移动到 switch 语句的内部。

 while(numOfMonth <= 12){

                int index = numOfMonth - 1;

                switch(numOfMonth++){

【讨论】:

  • 甚至在切换之后更好。
  • 更好的是:完全失去“索引”。 OP 不需要“numOfMonth”和“index”:“numOfMonth”就足够了。只需 1)在循环的底部(不是顶部)递增,2)记住数组是从 0 开始的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
  • 2013-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多