2015-02-18 2 views
0

Почему я получаю бесконечный цикл в методе рекурсии, без возможности ввода какого-либо символа, чтобы его сломать?Сканер (System.in) - бесконечный цикл

class Test { 
    int key=0; 
    void meth(){ 
    System.out.println("Enter the number here: "); 
    try(Scanner scan = new Scanner(System.in)) { 
     key = scan.nextInt(); 
     System.out.println(key+1); 
    } catch(Exception e) { 
     System.out.println("Error"); 
     meth(); 
    } 
    } 
} 

class Demo { 
    main method { 
    Test t = new Test(); 
    t.meth(); 
    } 
} 

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

ответ

2

Если nextInt() не работает, он выдает исключение, но не использует недопустимые данные. Из documentation:

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

Вы рекурсивно вызывая meth() снова, который будет пытаться потреблять те же недостоверные данные, второй раз, не в состоянии снова (не потребляющих его), и рекурсию.

Во-первых, я бы не использовал рекурсию здесь, в первую очередь. Предпочитайте простой цикл. Затем, если у вас есть недопустимый ввод, вы должны использовать его надлежащим образом, прежде чем повторять попытку. Наконец, рассмотрите использование hasNextInt вместо того, чтобы просто использовать nextInt и поймать исключение.

Так что, может быть что-то вроде этого:

import java.util.Scanner; 

class Test { 
    public static void main(String[] args){ 
     try (Scanner scanner = new Scanner(System.in)) { 
      System.out.println("Enter the number here:"); 
      while (!scanner.hasNextInt() && scanner.hasNext()) { 
       System.out.println("Error"); 
       // Skip the invalid token 
       scanner.next(); 
      } 
      if (scanner.hasNext()) { 
       int value = scanner.nextInt(); 
       System.out.println("You entered: " + value); 
      } else { 
       System.out.println("You bailed out"); 
      } 
     } 
    } 
} 
Смежные вопросы