Java: пока l oop не обнаруживает состояние разрыва, но если блокирует - PullRequest
0 голосов
/ 14 февраля 2020

просто хочу вырваться, пока я oop. Условие не нарушается, когда я предполагал, что оно будет выполнено, но оно регистрируется последующим оператором if.

  String current_Class_Name = "";
  int current_Class_Rating;  

    while(!current_Class_Name.equals("Done")) {

      // * Get class name.
      System.out.println("What class are you rating?");
      current_Class_Name = in.nextLine();
      // *
      // if(current_Class_Name.equals("Done")) {
      // System.out.println("Detected 'Done'");
      // break;
      // }

      // * Get class rating.
      System.out.println("How many plus signs does " + current_Class_Name + " get?");
      current_Class_Rating = Integer.parseInt(in.nextLine());

      // * If user inputs an invalid rating (not a value between 0-5),
      // * keep prompting them until they enter a valid input.
      while(current_Class_Rating > 5 || current_Class_Rating < 0) {
        System.out.println("Sorry, but you can only give a rating of 0-5.");
        System.out.println("How many plus signs does " + current_Class_Name + " get?");
        current_Class_Rating = Integer.parseInt(in.nextLine());
      }

      // * TODO
      // * Add to STRING and INTEGER LISTS.
    }


Возможно, возникает какая-то проблема порядка вызовов, поскольку строка "пуста" при вводе в то время как l oop. Извините за любое форматирование.

Спасибо за любую помощь.

ПРИМЕЧАНИЕ: Я обычно использую C# и, насколько я помню, какое-то время l oop будет пытаться обнаружить case условия перед завершением всей итерации.

EDIT: оператор if предназначен не для запуска, а для того, чтобы просто доказать две вещи: 1) что условие разрыва может быть обнаружено и 2) для разрыва в заданном время.

РЕДАКТИРОВАТЬ: Обновлено, чтобы показать весь код в рассмотрении.

Ответы [ 2 ]

1 голос
/ 14 февраля 2020

Попробуйте изменить реализацию на:

    String current_Class_Name = null;
    Integer current_Class_Rating = null;

    do {
        // * Get class name.
        System.out.println("What class are you rating?");
        current_Class_Name = in.nextLine().trim();


        try {
            // * Get class rating.
            System.out.println(String.format("How many plus signs does '%s' get?",current_Class_Name));
            current_Class_Rating = Integer.parseInt(in.nextLine().trim());
        }catch(NumberFormatException e) {
            current_Class_Rating = null;
        }

        if((current_Class_Rating == null)||(!(current_Class_Rating>=0 && current_Class_Rating <=5))) {
            System.out.println("Invalid rating value! Rating must be integer 0-5!");
            continue;  // skips back to beginning of the loop
        }

        // * TODO
        // * Add to STRING and INTEGER LISTS.

    }while(!current_Class_Name.equalsIgnoreCase("done"));
0 голосов
/ 14 февраля 2020

Ваш вопрос, по-видимому, основан на неправильном представлении, while l oop прекратится только тогда, когда условие будет переоценено на false вверху (не в момент обновления переменной ). Однако , вы можете сделать так, чтобы подсказка, назначение и оценка происходили одновременно. Сначала создайте вспомогательный метод. Например,

private static String promptForClassName(Scanner in) {
    System.out.println("What class are you rating?");
    return in.nextLine();
}

Затем используйте его с тем фактом, что присвоение (как побочный эффект) оценивается как присвоенное значение; также, пожалуйста следуйте стандартным Java соглашениям о присвоении имен верблюжьих коров Мол,

String currentClassName;
while (!(currentClassName = promptForClassName(in)).equalsIgnoreCase("Done")) {
    String prompt = "How many plus signs does " + currentClassName + " get?";
    // * Get class rating.
    System.out.println(prompt);
    int currentClassRating = Integer.parseInt(in.nextLine());

    // * If user inputs an invalid rating (not a value between 0-5),
    // * keep prompting them until they enter a valid input.
    while (currentClassRating > 5 || currentClassRating < 0) {
        System.out.println("Sorry, but you can only give a rating of 0-5.");
        System.out.println(prompt);
        currentClassRating = Integer.parseInt(in.nextLine());
    }

    // * TODO
    // * Add to STRING and INTEGER LISTS.
}
System.out.println("Detected 'Done'");
...