2013-03-14 2 views
2

Эй, ребята, я так долго пытался ответить на этот вопрос:
Напишите программу, которая просит пользователя ввести набор значений с плавающей запятой. Когда пользователь вводит значение, которое не является числом, дайте пользователю второй шанс ввести значение . После двух шансов выйдите из чтения. Добавьте все правильно заданные значения и распечатайте сумму, когда пользователь выполнил ввод данных. Используйте обработку исключений для обнаружения неправильных входов.Обработка исключений на Java - Как дать пользователю еще один шанс?

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

import java.util.Scanner; 
import java.util.InputMismatchException; 
public class q6{ 
public static void main(String[] args){ 
    Scanner in = new Scanner(System.in); 
    boolean firstChance = true; 
    boolean secondChance = true; 
    double sum = 0; 
    while (secondChance){ 
     try{ 
      while (firstChance){ 
       try{ 
        System.out.print("Please enter a number: "); 
        double input = in.nextDouble(); 
        sum = sum + input; 
       } 
       catch (InputMismatchException ex){ 
        firstChance = false; 
       } 
      System.out.print("Please enter a number to continue or something else to terminate: "); 
      double input = in.nextDouble(); 
      sum = sum + input; 
      firstChance = true; 
      } 
     } 
     catch (InputMismatchException e){ 
      secondChance = false; 
     } 
    } 
    System.out.print("The sum of the entered values is " + sum); 
} 
} 
+0

Вместо того, чтобы читать 'double', читайте' String' и используйте 'Double.parseDouble (String)'. Кроме того, если ваш 'firstChance' является' true' после блока 'try-catch', вы должны разбить' while-loop '. –

+0

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

ответ

0

я просто не знаю, как подойти к этой проблеме

псевдокод может быть следующим:

BEGIN 

    MAX_INPUT = 2; 
    i = 0; 

    WHILE i < MAX_INPUT 

     TRY 
      num = GET_NUM(); 
     CATCH 
      continue; 
     FINALLY 
      i++ 

    END WHILE 

END 
+0

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

+0

@LuiggiMendoza: О ... да. Спасибо за исправление. – Azodious

+0

Спасибо, что это сработало вместе с другими предложениями по повторной инициализации сканера после исключения. – Reddy

0

Вам нужен перерыва вашего while цикл, когда вы столкнулись с "плохого" входа. Затем вам нужно установить firstChance к истинную снова, так что вы можете получить доступ к второму while, вам также потребуется счетчик, который подсчитывает количество попыток (я назвал его chances):

int chances = 0; 
while (secondChance){ 
    firstChance = true; 
    try{ 
     while (firstChance){ 
      try{ 
       System.out.print("Please enter a number: "); 
       double input = in.nextDouble(); 
       sum = sum + input; 
      } 
      catch (InputMismatchException ex){ 
       chances ++; 
       in = new Scanner(System.in); 
       firstChance = false; 
      } 
      if(!firstChance && chances < 2) 
       break; 
      if(chances >= 2) { 
       System.out.print("Please enter a number to continue or something else to terminate: "); 
       double input = in.nextDouble(); 
       sum = sum + input; 
       firstChance = true; 
      } 
     } 
    } 
    catch (InputMismatchException e){ 
    secondChance = false; 
    } 
} 
+0

, это не желаемая работа программы. Прочтите вопрос еще раз. – uba

+0

Спасибо, исправлено .. – Maroun

0

Поскольку синтаксический анализ ввода в double не увенчался успехом, сканер не проходит мимо данного ввода. От javadoc Scanner

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

Поскольку перевод не увенчался успехом, он не продвигается. Итак, в блоке catch вы можете позвонить in.next(), чтобы пропустить токен.

0

Вы можете использовать целочисленный счетчик вместо булевых переменных firstChance и secondChance и сделать что-то вроде:

int attempts = 0; 
while(attempts < 2) { 
    try { 
     //Get user input - possible exception point 
     //Print sum 
    } catch(InputMismatchException e) { 
     attempts++; 
     //Continue? 
    } 
} 
0
import java.util.*; 

public class q6 { 
    public static void main(String[] args) { 
     Scanner in = new Scanner(System.in); 
     double inputNumber, sum = 0.0; 
     int correctCount = 0, wrongCount = 0; 

     while(wrongCount <=1) { 
      System.out.println("Please enter a numeric floating value:"); 
      try { 
       inputNumber = in.nextDouble(); 
       correctCount++; 
       sum += inputNumber; 
       if(correctCount >= 2) 
        break; 
      } catch(InputMismatchException e) { 
       wrongCount++; 
       in = new Scanner(System.in); 
       continue; 
      } 
     } 
     System.out.println(sum); 
    } 
} 
0

Как указано в моем комментарии, для того, чтобы не иметь дело с сканер неправильно читать, было бы лучше использовать Scanner#nextLine() и считывать данные как String, а затем попытаться разобрать его как double используя Double#parseDouble(String) так как этот метод уже бросает NumberFormatException и вы может справиться с этой ошибкой.Кроме того, было бы лучше, что ваш код может работать с более чем 1 запрос (если ваш учитель или кто-то другой просит, чтобы сделать это):

final int REQUEST_TIMES = 2; 
double sum = 0; 
for(int i = 1; i <= REQUEST_TIMES; i++) { 
    while (true) { 
     try { 
      if (i < REQUEST_TIMES) { 
       System.out.print("Please enter a number: "); 
      } else { 
       System.out.print("Please enter a number to continue or something else to terminate: "); 
      } 
      String stringInput = in.nextLine(); 
      double input = Double.parseDouble(stringInput); 
      sum += input; 
     } catch (NumberFormatException nfe) { 
      System.out.println("You haven't entered a valid number."); 
      break; 
     } 
    } 
} 
0

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

public class q6 { 

    static int trial = 0; 

    public static void main(String[] args) { 
     double sum = 0; 

     while (trial <= 2) { 
      Scanner in = new Scanner(System.in); 
      try { 
       trial++; 
       System.out.print("Please enter a number: "); 
       double input = in.nextDouble(); 
       sum = sum + input; 
       trial=3; 
      } catch (InputMismatchException ex) { 
       trial++; 
       if (trial == 4){ 
        System.out.println("You have entered wrong values twice"); 
       } 
      } 
     } 
     if (trial <= 3){ 
      System.out.print("The sum of the entered values is " + sum); 
     } 
    } 

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

+0

По какой-то причине инициализация сканера вне цикла не будет работать с несколькими попытками! – Rakesh

Смежные вопросы