2015-10-09 2 views
0

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

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

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

Любые советы/приемы или другие специальные способы обойти это?

public class MultiplicationTable 
{ 
    private int intervalMin; 
    private int intervalMax; 
    private int multiplier; 
    private int result; 
    private Scanner sc; 

    public MultiplicationTable() 
    { 
     multiplier = 0; 
     intervalMin = 0; 

     sc = new Scanner(System.in); 

     while (multiplier == 0) 
     { 
      System.out.println("Please enter the integer you wish to show the table for"); 
      if (sc.hasNextInt()) 
      { 
       multiplier = sc.nextInt(); 

      } 
      else 
      { 
       System.out.println("Input is not an integer\n"); 
      } 
     } 

     while (intervalMin == 0) 
     { 
      System.out.println("\nPlease enter the integer defining the start of the table"); 
      if (sc.hasNextInt()) 
      { 
       intervalMin = sc.nextInt(); 
      } 
      else 
      { 
       System.out.println("Input is 0 or not an integer\n"); 
      } 

     } 

     while (intervalMax == 0) 
     { 
      System.out.println("\nPlease enter the integer defining the end of the table"); 
      if (sc.hasNextInt()) 
      { 
       int i = sc.nextInt(); 
       if (i > intervalMin) 
       { 
        intervalMax = i; 
       } 
       else 
       { 
        System.out.println("\nEnd integer must be greater than start integer"); 
       } 
      } 
      else 
      { 
       System.out.println("Input is 0 or not an integer"); 
      } 

     } 

     System.out.println("\nTable for integer " + multiplier + " from " + intervalMin + " to " + intervalMax + "\n"); 
     for (int i = intervalMin; i <= intervalMax; i++) 
     { 
      result = i * multiplier; 
      System.out.println(i + " * " + multiplier + " = " + result); 
     } 
    } 
} 

ответ

0

Вы не потребляли то, что пользователь ввел в буфер сканера, поэтому sc.hasNextInt() продолжает получать казнены не дожидаясь следующего входа пользователя. Решение состоит в том, чтобы добавить sc.nextLine() после условия if. Например:

boolean gotInteger = false; 
    while (!gotInteger) { 
     System.out.println("Please enter the integer you wish to show the table for"); 
     if (sc.hasNextInt()) { 
      multiplier = sc.nextInt(); 
      gotInteger = true; 
     } else { 
      System.out.println("Input is not an integer\n"); 
     } 
     sc.nextLine(); 
    } 
+0

sc.nextLine будет использовать последний пользовательский ввод и снова вызовет sc.hasNextInt, он будет ожидать ввода другого пользователя. – Bon

+0

Это точно работает. Большое спасибо! Однако я не могу сказать, что полностью понимаю это. – stormman67

0

Отвод попробовать это, просто обернуть весь код в попытке поймать:

try { 
    while (intervalMax == 0) { 
     System . out . println("\nPlease enter the integer defining the end of the table"); 
     if (sc . hasNextInt()) { 

      int i = sc . nextInt(); 

      if (i > intervalMin) { 
       intervalMax = i; 
      } else { 
       throw new Exception("\nEnd integer must be greater than start integer"); 
      } 
     } 

    } 
} catch (Exception e) { 
    System . out . println(e . getMessage()); 
} 
+0

Да, это действительно положило конец печати. Но дело в том, что он должен вернуться к вершине цикла while, пока он фактически не получит целое число. – stormman67

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