Я должен разделить дату, введенную пользователем в формате DDMMYYYY. Однако, если вы введете 70702000, он отображает все 3 мои ошибки вместо одной - PullRequest
0 голосов
/ 23 марта 2020

Ниже кода:

    {
        System.out.println("Please enter the date you would like to split");
        System.out.println("Please make sure it is in the format DDMMYYYY");
        date = sc.nextInt();

        day = date / 1000000;
        month = (date / 10000) - (day * 100);
        year = date - (date / 10000) * (10000);

        switch(day) 
        {
            case 1: case 21: case 31: 
                suffix = "st";
            break;

            case 2: case 22:
                suffix = "nd";
            break;

            case 3: case 23: 
                suffix = "rd";
            break;

            case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 18: case 19: case 20: case 24: case 25: case 26: case 27: case 28: case 29: case 30:
                suffix = "th";
            break;

            default:
                System.out.println("Error, Please enter a valid day (i.e. DD) that is between 01 - 31");
            break;
        }

        switch(month)
        {
            case 4: case 6: case 9: case 11: 
                if ((day < 1) || (day > 30))
                {
                    System.out.println("Error this day does not exist"); 
                }
            break;

            case 1: case 3: case 5: case 7: case 8: case 10: case 12: 
                if ((day < 1) || (day > 31))
                {
                    System.out.println("Error this day does not exist");
                }
            break;

            case 2:
                if ((day < 1) || (day > 28))
                {
                    if ((day != 29)) 
                    {
                        System.out.println("Error this day does not exist");
                    }
                    else if ((year % 4 != 0) || ((year % 400 != 0) && (year % 100 == 0)))
                    {
                        System.out.println("Error this day does not exist");
                    }
                        //If it isn't a leap year, febuary cannot have 29 days
                }
            break;
            default:
                System.out.println("Error this day does not exist");
        }

        switch(month)
        {
            case 1:
                monthName = "January";
            break;
            case 2:
                monthName = "Febuary";
            break;
            case 3: 
                monthName = "March";
            break;
            case 4:
                monthName = "April";
            break;
            case 5: 
                monthName = "May";
            break; 
            case 6: 
                monthName = "June";
            break;
            case 7:
                monthName = "July";
            break;
            case 8:
                monthName = "August";
            break;
            case 9: 
                monthName = "September";
            break; 
            case 10:
                monthName = "October";
            break;
            case 11: 
                monthName = "November";
            break;
            case 12:
                monthName = "December";
            default:
                System.out.println("Error, Please make sure the month (i.e. MM) is between 01 and 12");
            break;
        }

        if ((day == 29) && (month == 2))
        {
            System.out.println("It is the 29th day of Febuary in " + year + ".");
        }
        else 
        {
            System.out.println("It is the " + day + suffix + " day of " + monthName + " in " + year + ".");
        }
    }

Итак, в основном, когда я запускаю эту программу и введите 70702020 значение, я получу все следующие выходные данные:

Ошибка, пожалуйста, введите действительный день (т.е. ДД), который находится между 01 - 31

Ошибка в этот день не существует

Ошибка, Пожалуйста, убедитесь, что месяц (т.е. ММ) находится между 01 и 12

И тогда он выведет окончательный результат (это было предназначено, только если пользователь ввел правильную дату)

Ответы [ 3 ]

1 голос
/ 23 марта 2020

break прерывается только в операторе switch

Команды break в ваших операторах switch выполняются только из оператора switch, не весь ваш метод .

У вас есть серия из трех операторов switch.

  • Когда вы выходите из первого оператора switch, поток управления переходит ко второму оператору switch.
  • Когда вы выходите из второго оператора switch, поток управление переходит к третьему оператору switch.
  • Когда вы выходите из третьего оператора switch, поток управления переходит к остальным операторам.

Одной из основных концепций программирования является scope . Вы должны научиться мыслить в терминах коробок, вложенных в коробки, например русских матрешек . В операторе switch область действия команды break - это всего лишь один оператор, а не весь ваш метод. Оператор switch - это один уровень области видимости, вложенный во внешний метод. break в операторе switch может только «видеть» его непосредственно содержащее поле: оператор switch.

java .time

Кстати, парсинг как текст через современные java .time классы намного проще.

try {
    LocalDate ld = 
            LocalDate
            .parse( 
                "70702020" , 
                DateTimeFormatter.ofPattern( "ddMMuuuu" ) 
            )
    ;
} catch ( DateTimeParseException e ) {
    … 
}

Неверные значения ввода DateTimeParseException.

0 голосов
/ 23 марта 2020

Вы используете переключатель вместо оператора if (бла-бла). Смысл в том, что утверждение верно и теперь выдает ошибки. Ваш код говорит, что с вашим вводом ничего не случилось. Ваш суффикс все равно будет печататься, но я буду печатать пустые кавычки, так как это пустая строка. Я предлагаю проверить вход перед использованием коммутатора. Или используя «System.exit (1)», где ваша система выйдет при неправильном вводе.

Редактировать: Также ваш расчетный день будет равен «70», что приведет к другим ошибкам.

0 голосов
/ 23 марта 2020

Предлагаю посмотреть комментарий, а затем выполнить код самостоятельно. Я добавляю некоторые комментарии.

public class TestFormatDate{

     public static void main(String []args){
        System.out.println("Please enter the date you would like to split");
        System.out.println("Please make sure it is in the format DDMMYYYY");

        //your input:70702020
        int date = 70702020;

        //70
        int day = date / 1000000;
        //70
        int month = (date / 10000) - (day * 100);
        //2020
        int year = date - (date / 10000) * (10000);
        String suffix = null;
        String monthName = null;
        switch(day) 
        {
            case 1: case 21: case 31: 
                suffix = "st";
            break;

            case 2: case 22:
                suffix = "nd";
            break;

            case 3: case 23: 
                suffix = "rd";
            break;

            case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 18: case 19: case 20: case 24: case 25: case 26: case 27: case 28: case 29: case 30:
                suffix = "th";
            break;
            // day is 70, so the default is executed.
            default:
                System.out.println("Error, Please enter a valid day (i.e. DD) that is between 01 - 31");
            break;
        }

        switch(month)
        {
            case 4: case 6: case 9: case 11: 
                if ((day < 1) || (day > 30))
                {
                    System.out.println("Error this day does not exist"); 
                }
            break;

            case 1: case 3: case 5: case 7: case 8: case 10: case 12: 
                if ((day < 1) || (day > 31))
                {
                    System.out.println("Error this day does not exist");
                }
            break;

            case 2:
                if ((day < 1) || (day > 28))
                {
                    if ((day != 29)) 
                    {
                        System.out.println("Error this day does not exist");
                    }
                    else if ((year % 4 != 0) || ((year % 400 != 0) && (year % 100 == 0)))
                    {
                        System.out.println("Error this day does not exist");
                    }
                        //If it isn't a leap year, febuary cannot have 29 days
                }
            break;
            // month is 70, so the default is executed.
            default:
                System.out.println("Error this day does not exist");
        }

        switch(month)
        {
            case 1:
                monthName = "January";
            break;
            case 2:
                monthName = "Febuary";
            break;
            case 3: 
                monthName = "March";
            break;
            case 4:
                monthName = "April";
            break;
            case 5: 
                monthName = "May";
            break; 
            case 6: 
                monthName = "June";
            break;
            case 7:
                monthName = "July";
            break;
            case 8:
                monthName = "August";
            break;
            case 9: 
                monthName = "September";
            break; 
            case 10:
                monthName = "October";
            break;
            case 11: 
                monthName = "November";
            break;
            case 12:
                monthName = "December";
            // month is 70, so the default is executed.
            default:
                System.out.println("Error, Please make sure the month (i.e. MM) is between 01 and 12");
            break;
        }

        if ((day == 29) && (month == 2))
        {
            System.out.println("It is the 29th day of Febuary in " + year + ".");
        }
        // day is 70, so the else is executed.
        else 
        {
            System.out.println("It is the " + day + suffix + " day of " + monthName + " in " + year + ".");
        }
     }
}
...