2015-02-01 3 views
-1

Я читаю данные пользователя (оценка экзамена). Затем я проверяю оценку. После этого я показываю оценку. Затем я спрашиваю у пользователя, хотят ли они ввести другой класс, если они скажут «да», тогда я прошу их ввести еще один экзамен. Но здесь я использую try/catch для проверки типа данных, которые они вводят. Если они вводят что-нибудь другое, то целое число, то я пытаюсь снова зациклиться и спросить, хотят ли они ввести другой класс, но также отобразить сообщение «Ввести целочисленное сообщение об ошибке». Однако в этом случае вы хотите ввести еще один класс дважды, а счет экзамена дважды, он печатает старый счет, и он печатает, хотите ли вы дважды ввести другое утверждение класса, почему это происходит?Неправильная печать петли

import java.util.InputMismatchException; 
import java.util.Scanner; 


public class CatchingException { 

public static void main(String[] args) { 
    Scanner scan = new Scanner(System.in); 
    int score; 
    String choice; 
    boolean loop = true; 


    try { 
     System.out.println("Enter your percentage mark: "); 
     score = scan.nextInt(); 


     do { 
      if(score <40) { 
       System.out.println("You FAILED"); 
      }else if(score >=40 && score <50){ 
       System.out.println("Your grade: PASS MARK"); 
      }else if(score >=50 && score <60) { 
       System.out.println("Your grade: 2:2"); 
      }else if (score >=60 && score <70) { 
       System.out.println("Your grade: 2:1"); 
      }else { 
       System.out.println("Your grade: 1:1"); 
      } 

      System.out.println("Do you want to enter another grade: "); 
      choice = scan.next(); 
      if(choice.equalsIgnoreCase("yes")) { 
       System.out.println("Enter your percentage mark: "); 
       try{ 
        score = scan.nextInt(); 
       }catch(InputMismatchException e) { 
        System.err.println("Enter Integer"); 
        loop = false; 
       } 

      } 
     }while(!loop); 

    }catch(InputMismatchException e) { 
     System.err.println("Incorrect Input "); 
    } 

    System.out.println("program terminated"); 
    scan.close(); 

} 

    } 
+1

Измените текст. Это почти невозможно прочитать. – SklogW

+0

@Pshemo Я считаю, что OP имеет дело с концевой строкой слева в буфере клавиатуры 'nextInt'. –

+0

@ PM77-1 '#nextInt()' не «заботится» о пробелах. – Tom

ответ

0

Попробуйте упростить это с помощью выражений и ярлыков разветвления!

import java.util.InputMismatchException; 
import java.util.Scanner; 


public class CatchingException { 

    public static void main(String[] args) { 


     Scanner scan = new Scanner(System.in); 
     int score; 
     String choice; 

     Main: 
     while (true) { //this will continue until we call "break Main;" 
      try { 
       System.out.println("Enter your percentage mark: "); 
       score = scan.nextInt(); 

       if (score < 40) { 
        System.out.println("You FAILED"); 
       } else if (score >= 40 && score < 50) { 
        System.out.println("Your grade: PASS MARK"); 
       } else if (score >= 50 && score < 60) { 
        System.out.println("Your grade: 2:2"); 
       } else if (score >= 60 && score < 70) { 
        System.out.println("Your grade: 2:1"); 
       } else { 
        System.out.println("Your grade: 1:1"); 
       } 

       Prompt: 
       while (true) { //this will continue until we call "break Prompt;" 
        System.out.println("Do you want to enter another grade: "); 
        choice = scan.next(); 
        try { 
         if (choice.equalsIgnoreCase("yes")) { 
          continue Main; //OK. Start again at "Main:" 
         } else if (choice.equalsIgnoreCase("no")) 
          break Main; //OK. We're done. 
         else { 
          System.err.println("Incorrect Input "); 
          continue Prompt; //whoops! try asking again. 
         } 
        } catch (InputMismatchException e) { 
         System.err.println("Incorrect Input "); 
         continue Prompt; //whoops! try asking again. 
        } 
       } 
      } catch (InputMismatchException e) { 
       System.err.println("Incorrect Input "); 
       continue Main; //whoops! try another input. 
      } 
     } 
     System.out.println("program terminated"); 
     scan.close(); 
    } 
} 
0

Прежде всего, как вы устанавливаете переменную loop указывает на то, что вы хотите сохранить итерации, пока loop является true. В этом случае вам следует изменить while(!loop); на while (loop);

После этого вы должны посмотреть, что произойдет, если пользователь напишет «нет», если его спросят, хотят ли они ввести новый класс. Поскольку это (с вышеуказанным изменением), вы будете продолжать повторять. Чтобы устранить эту проблему, Вы можете изменить

System.out.println("Do you want to enter another grade: "); 
choice = scan.next(); 
if(choice.equalsIgnoreCase("yes")) { 
    System.out.println("Enter your percentage mark: "); 
    try{ 
     score = scan.nextInt(); 
    }catch(InputMismatchException e) { 
     System.err.println("Enter Integer"); 
     loop = false; 
    } 
} 

Чтобы что-то вроде

System.out.println("Do you want to enter another grade: "); 
choice = scan.next(); 
if(choice.equalsIgnoreCase("no")) { 
    loop = false; 
} 

это сделает любой вход (кроме «не») вызвать петлю, чтобы держать итерации. (Если вы хотите только «да» на работу, то это должно быть довольно легко исправить с некоторыми дополнительными проверками.)

Конечно, делать это может потребовать от вас, чтобы положить

System.out.println("Enter your percentage mark: "); 
score = scan.nextInt(); 

внутри do-while петля.

do { 
    System.out.println("Enter your percentage mark: "); 
    score = scan.nextInt(); 

Если вы хотите, чтобы просить процент знака, если пользователь не введет правильное число, вы можете сделать что-то вроде этого:

System.out.println("Enter your percentage mark: "); 
while (!scan.hasNextInt()) { 
    System.out.println("Please enter a valid percentage mark: "); 
    scan.next(); 
} 
score = scan.nextInt(); 

Это будет держать не спрашивать, пока пользователь вводит фактическое целое число.

+0

Точка программы в основном, когда программа запрашивает Введите свой процентный знак и пользователь вводит что-либо еще, кроме целого числа, тогда программа должна зацикливаться и еще раз попросить ввести свой процентный знак, вместо этого программа переходит в бесконечный цикл –

+0

Не уверен, что вы имеете в виду. С моими изменениями код не будет запрашивать снова неверный ввод, это правильно. Но когда я запускаю код и вводя нецелое число, он печатает «_Invalid Input_» и завершает работу. Нет бесконечной петли. – MAV

0

С вашего вопроса why is this happening Я попробую объяснить это вам. Мой пример ввод заключается в следующий:

Enter your percentage mark: 
70 
Your grade: 1:1 
Do you want to enter another grade: 
yes 
Enter your percentage mark: 
a 

a не действует целого, поэтому Scanner#nextInt() бросает InputMismatchException и программа «идут» в catch блока:

catch(InputMismatchException e) { 
    System.err.println("Enter Integer"); 
    loop = false; 
} 

Здесь программа выводит сообщение об ошибке и устанавливает loop на false. Из-за состояния whilewhile(!loop) он собирается выполнить новую итерацию цикла.Имейте в виду, что Scanner#nextInt() не «читает» (и удаляет) недопустимый вход из входного потока, поэтому он все еще там.

Таким образом, мы снова здесь:

do { 
    if(score <40) { 
     System.out.println("You FAILED"); 
    } 
    //... 

Как вы можете заметить, что нет не score = scan.nextInt(); заявления здесь, поэтому, программа повторно старого входа оценки 70. Из-за этого факта, он печатает один и тот же балл сообщение снова (полная мощность до этого момента):

Enter your percentage mark: 
70 
Your grade: 1:1 
Do you want to enter another grade: 
yes 
Enter your percentage mark: 
a 
Enter Integer 
Your grade: 1:1 

После проверки бальной он спросит нас снова, если мы хотели бы ввести другой счет:

System.out.println("Do you want to enter another grade: "); 
choice = scan.next(); 

И вот еще одна проблема: a, который мы ввели в последней итерации, по-прежнему доступны, и поскольку Scanner#next() принимает этот ввод, choice теперь будет "a". Вот почему это if заявления возвращает ложь и его тело будет пропущено ("a" не равна "yes"):

if(choice.equalsIgnoreCase("yes")) { 

Наша ситуация сейчас, что a ушел из входного потока и loop по-прежнему установлен false. Таким образом, программа будет принимать другую итерацию цикла, и мы находимся в самом начале цикла (снова):

do { 
    if(score <40) { 
     System.out.println("You FAILED"); 
    } 
    //... 

И опять же, мы не читаем прямо сейчас забивать здесь. Вместо этого мы повторно используем старый ввод оценки 70. Это означает, что мы получаем точно такое же сообщение:

Your grade: 1:1 

Хорошей вещи является: a ушел из входного потока и следующий вопрос делает в запросе фактически новый ввод от пользователя:

System.out.println("Do you want to enter another grade: "); 
choice = scan.next(); 

Так что решать ему, что он хочет.


Как вы можете видеть сейчас, вам нужно прочитать недопустимый ввод в вашем catch блоке, или это будет беспокоить вас позже. И вы должны прочитать новый score в начале цикла do/while, иначе вы можете повторно использовать старый ввод.

Надеюсь, что ответ поможет вам понять вашу программу немного больше :). И вы должны потратить некоторое время, чтобы узнать, как использовать отладчик. Это очень полезно в таких случаях.

0

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

1) Это делает код легче читать
2) Делает процесс проще

я имел Проблема с чтением кода. Я просто сделал это, и он отлично работает. ПРИМЕЧАНИЕ. Я не добавлял попытку для этого, но если вы знаете, как это сделать, а также если пользователь не вводит «да» или «нет». Просто базовый пример.

public static void main(String[] args) 
{ 
    Scanner scan = new Scanner(System.in); 
    int score; 
    String choice; 
    while(true) 
    { 
     System.out.println("Enter your percentage mark: "); 
     score = scan.nextInt(); 
     if(score <40) 
     { 
      System.out.println("You FAILED"); 
     } 
     else if(score >=40 && score <50) 
     { 
      System.out.println("Your grade: PASS MARK"); 
     } 
     else if(score >=50 && score <60) 
     { 
      System.out.println("Your grade: 2:2"); 
     } 
     else if (score >=60 && score <70) 
     { 
      System.out.println("Your grade: 2:1"); 
     } 
     else 
     { 
      System.out.println("Your grade: 1:1"); 
     } 

     System.out.println("Do you want to enter another grade: "); 
     choice = scan.next(); 

     if(choice.equalsIgnoreCase("no")) 
     { 
      System.out.println("Program terminated"); 
      scan.close(); 
      break; 
     } 
    } 
} 
Смежные вопросы