Дублирующая лента-сканер для do-while?(Джава) - PullRequest
0 голосов
/ 23 ноября 2018

Так что я немного озадачен тем, почему это происходит, вот мой код:

public static void main (String[] args)
{
    Scanner kb = new Scanner(System.in);

    do
    {
        Scanner in = new Scanner(System.in);
        System.out.println("Enter a time in 24-hour notation: ");
        String time = in.nextLine();

        int colonIndex = time.indexOf(":");
        int hours = Integer.parseInt(time.substring(0, colonIndex));
        int minutes = Integer.parseInt(time.substring(colonIndex + 1));

        boolean legalTime = ((hours < 24 && hours > 0) && (minutes < 60 && minutes >= 0));
        boolean addZero = minutes < 10;
        boolean pm = hours > 12;

        if(legalTime)
        {
            if(pm && addZero)
            {
                int newHour = hours - 12;
                System.out.printf("That is the same as"
                        + "\n%d:0%d PM\n", newHour, minutes);
            }
            else if(pm && !addZero)
            {
                hours = hours - 12;
                System.out.printf("That is the same as"
                        + "\n%d:%d PM\n", hours, minutes);
            }
            else if (!pm && addZero)
            {
                System.out.printf("That is the same as"
                        + "\n%d:0%d AM\n", hours, minutes);
            }
            else
            {
                System.out.printf("That is the same as"
                        + "\n%d:%d AM\n", hours, minutes);
            }
        }
        try
        {
            if(!legalTime)
            {
                throw new Exception("Exception: there is no such time as " + time);
            }
        }
        catch(Exception e)
        {
            System.out.println(e.getMessage()
                    + "\nAgain? (y/n)");
            continue;
        }

        System.out.println("Again? (y/n)");

    }while(Character.toUpperCase(kb.next().charAt(0)) == 'Y');

}

Мой код сам по себе не является проблемой, он состоит в том, что условие цикла do-while распознает толькоbooleans за пределами do-while, что, на мой взгляд, вызывает разочарование, когда на состояние влияет то, что находится внутри блока.Что я хочу сделать, так это запустить мой код, а затем спросить пользователя, хотят ли они запустить его снова, обозначенного «y» или «n».Я не могу поставить

!time.charAt(0) == 'y'

как условие, потому что строка «время» определена внутри цикла do-while, поэтому я сделал несколько странных повязок, используя один сканер только для ввода условия доначинается do-while и использование другого внутри тела.Я знаю, что это плохо, но я не могу придумать простой способ создать логическое значение для этого условия, которое не входит в цикл do-while, я что-то упустил?

1 Ответ

0 голосов
/ 23 ноября 2018

Просто объявите boolean перед циклом вместо дополнительных Scanner и обновите это boolean внутри цикла:

boolean again = true;
do {
    ...
    System.out.println("Again? (y/n)");
    again = Character.toUpperCase(in.next().charAt(0)) == 'Y';
} while (again);
...