Как сделать так, чтобы цикл do while не сбрасывался?

Рисунок 1

Рис.2.

Я подозреваю, что моя проблема в цикле do while. Пожалуйста, используйте мой код и изображения для справки.

Мне удалось заставить программу принимать только правильное входное значение, даже если вы вводите неправильное значение, как вы можете видеть на рисунке 1.

Но он всегда будет возвращаться к первому входу, когда вы вводите неправильное значение во втором или третьем входе. Пожалуйста, см. Рис.2 для получения результата, который я ищу.

import java.util.Scanner;

public class Lab4 {

public static void main(String[] args)
{
    Scanner input = new Scanner (System.in);
    boolean ok = true;

    do {
    try
    {
        int hours = getHours();
        int minutes = getMinutes();
        int seconds = getSeconds();

        print24HourTime(hours, minutes, seconds);

        ok = true;
    }
    catch (InvalidHrExcep a)
    {
        System.out.println (a.getmessage());
        ok = false;
    } 
    catch (InvalidMinExcep b)
    {
        System.out.println(b.getmessage());
        ok = false;
    }
    catch (InvalidSecExcep c)
    {
        System.out.println (c.getmessage());
        ok = false;
    }
    }while (ok == false);
  }


public static int getHours() throws InvalidHrExcep
{
    Scanner input = new Scanner (System.in);
    System.out.println("Enter hours: ");
    int hoursValue = input.nextInt();
    if ((hoursValue < 0 ) || (hoursValue > 12)) {
        throw new InvalidHrExcep("The value of hours must be between 0 and 12");
    }
    return hoursValue;
}

public static int getMinutes() throws InvalidMinExcep
{
    Scanner input = new Scanner (System.in);
    System.out.println("Enter minutes: ");
    int minutesValue = input.nextInt();
    if ((minutesValue <0) || (minutesValue > 60))
    {
        throw new InvalidMinExcep("The value of minutes must be between 0 and 60");
    }
    return minutesValue;
}

public static int getSeconds() throws InvalidSecExcep
{
    Scanner input = new Scanner (System.in);
    System.out.println("Enter seconds: ");
    int secondsValue = input.nextInt();
    if ((secondsValue <0) || (secondsValue > 60))
    {
        throw new InvalidSecExcep("The value of seconds must be between 0 and 60");
    }
    return secondsValue;
}

public static void print24HourTime(int hr, int min, int sec)
{
    Scanner input = new Scanner (System.in);
    System.out.println("Enter AM or PM: ");
    String ampm = input.next();
    if ((ampm.equals("am") || (ampm.equals("AM"))))
    {
        System.out.printf("24 hour clock time: %02d:%02d:%02d" , hr, min, sec);         
    }
    if ((ampm.equals("pm") || (ampm.equals("PM"))))
    {
        System.out.printf("24 hour clock time: %02d:%02d:%02d" , hr+12, min, sec);
    }
}
}

class InvalidSecExcep extends Exception{
private String message;

public InvalidSecExcep()
{

}

public InvalidSecExcep(String str)
{
    this.message = str;
}

public String getmessage()  
{
    return this.message;
}

public String tostring()
{
    String c = message;
    return c;
}
}

class InvalidMinExcep extends Exception {
private String message;

public InvalidMinExcep()
{

}

public InvalidMinExcep(String str)
{
    this.message = str;
}

public String getmessage()
{
    return this.message;
}

public String tostring()
{
    String b = message;
    return b;
}
} 

class InvalidHrExcep extends Exception{
private String message;

public InvalidHrExcep()
{

}

public InvalidHrExcep(String str)
{
    this.message = str;
}

public String getmessage()
{
    return this.message;
}

public String tostring()
{
    String a = message; 
    return a;
}
}   

Я думаю, что ваша ошибка в ваших методах, вы сохраняете ввод только тогда, когда он правильный. Вы никогда не сохраните ввод, если он является неправильной причиной исключения.

Paplusc 07.05.2018 15:59

Делайте ... пока в каждом методе, а не в основном методе. Передайте input каждому методу вместо создания новых экземпляров сканера. Потребность в исключениях отпадает, и основной метод будет меньше / чище.

Andrew S 07.05.2018 15:59
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
181
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

  1. Объявить целые часы, целые минуты ..

  2. Сохраните введенные вами данные при наличии атрибута, например. this.hours = getHours();

  3. Проверьте, определен ли ваш атрибут, например. if (this.hours == null){ this.hours = getHours()}

Ответ принят как подходящий

Здесь лучше работать с несколькими циклами do while.

Если вы начинаете с do во время получения часов, и у вас есть переменная, проверяющая это, когда она будет выполнена, то отдельные этапы для каждого другого этапа.

Обернул бы все это в один большой цикл do while. Таким образом, пока вы находитесь в большом цикле do while, он будет проверять, завершен ли каждый этап. Небольшой пример кода sudo ниже:

bool hours = false
bool min = false
bool seconds = false
Do:

Do(
getHours()
While bool hours = false)


Do(
getmin()
While bool min= false)

Do(
getseconds()
While bool seconds= false)

while ok == false

Очевидно, у вас также есть свои тесты на исключения, просто чтобы показать вам общую структуру. Может хранить значения и проверять, равны ли они нулю, вместо того, чтобы проверять логические значения.

Извините, я не могу заставить его работать. Я продолжал получать синтаксическую ошибку

C.J.W 07.05.2018 17:22

Это код sudo, а не настоящий код. Я показываю вам концепцию того, как это работает. Если вы просто попытаетесь скопировать его, вы получите 100% синтаксических ошибок. Синтаксис просто означает, что вы набираете что-то неправильно, это не имеет ничего общего с логикой.

Lain 07.05.2018 17:26

Хорошо, мне удалось заставить его работать благодаря вашей помощи. Я очень ценю это! Спасибо чувак.

C.J.W 08.05.2018 14:24

Другие вопросы по теме