Как сохранить продолжение той же строки, если ввод пользователя неправильный? - PullRequest
0 голосов
/ 06 января 2020

Когда я запускаю код, если вы введете символ вместо целого числа, он предложит ввести еще раз. Но если мы ответим на 2-й или 3-й вопрос, в случае ошибки он вернет вас к 1-му вопросу. Есть ли способ это исправить? Большое спасибо!

 while (true) {
       try {
           Scanner input = new Scanner(System.in);

           System.out.println("Enter your monthly income (after tax and insurance): ");
           float monthlyIncome = input.nextFloat();

           System.out.println("Enter monthly cost for food: ");
           float monthlyFoods = input.nextFloat();

           System.out.println("Enter monthly cost for rent: ");
           float monthlyRent = input.nextFloat();

           System.out.println("Enter monthly cost for utilities " +
                   "(e.g. gas, phone bills, Internet): ");
           float monthlyUtilities = input.nextFloat();

           System.out.println("Enter monthly cost for shopping and hobbies: ");
           float monthlyHobbies = input.nextFloat();

           System.out.println("Do you plan for saving? (Enter 0 if not): ");
           float monthlySaving = input.nextFloat();

           monthlyExpenses(monthlyIncome, monthlyFoods, monthlyRent, 
                   monthlyUtilities, monthlyHobbies, monthlySaving);
           break;

    } catch (InputMismatchException exception) {
        System.out.println("Please enter number only!");
    }
  }

Ответы [ 3 ]

1 голос
/ 06 января 2020

Используйте код, который требуется повторить в случае ошибки внутри цикла while; что делает ваш код таким:

while (true) {
    float value;
    try {
    // code to get proper value from user & store in `value`     
    return value;
    } catch (InputMismatchException exception) {
        System.out.println("Please enter number only!");
    }
  }

Теперь просто переместите этот код в метод:

float getFloatValue(String questionDescription){

while (true) {
    float value;
    try {
      Scanner input = new Scanner(System.in); 
      System.out.println(questionDescription+": ");
      value = input.nextFloat();
      return value;
    } catch (InputMismatchException exception) {
        System.out.println("Please enter number only!");
    }
  }
 return Float.NaN;
}

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

          float monthlyIncome = getFloatValue("Enter your monthly income (after tax and insurance)");

          float monthlyFoods = getFloatValue("Enter monthly cost for food");

          float monthlyRent = getFloatValue("Enter monthly cost for food");
          // get other values same as above
           monthlyExpenses(monthlyIncome, monthlyFoods, monthlyRent, 
                   monthlyUtilities, monthlyHobbies, monthlySaving);

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

1 голос
/ 06 января 2020
  public static float getFloat(String message)
  {
   float value;
   while (true) {
   try {
       Scanner input = new Scanner(System.in);
       System.out.println(message);
       value=input.nextFloat();

  } catch (InputMismatchException exception) {
    System.out.println("Please enter number only!");
  }}
  return value;
  }
    float monthlyIncome = getFloat("Enter your monthly income (after tax and insurance): ");

// Примерно так

0 голосов
/ 06 января 2020

Другой возможностью было бы сохранить все вопросы в массив и посчитать с переменной в качестве индекса, сколько входных данных было передано. Затем во втором массиве вы сохраняете входные данные, и в конце вам просто нужно преобразовать их.

Преимущество: это легко настраивается и может быть легко расширено.

Код будет выглядеть как-то вот так.

// Lots of Code here
Scanner scan = new Scanner(System.in);
int count = 0;
String[] questions = {"How high...?", "[Insert questions 2]"}; // Put in all your questions here
float[] answers = new float[questions.length]; // array for answers
while(count < questions.length) {
    try {
        System.out.println(questions[count]);
        answers[count] = Float.parseFloat(scan.nextLine());
        count++;
    } catch (Exception e) {
        System.out.println("Bad doggo! No food for you tonight!"); // Tell the user he was a bad guy
    }
}
scan.close();
// If you want you can convert the answer array back to variables here but I think this way is easier
// More code
...