2013-05-01 128 views
2

我写了这个简单的代码来获取一个double,直到给出一个请求,但是当你给一个字符串时,它会变成一个无限循环,我不知道为什么。为什么会这样表现?这段代码为什么会变成无限循环?

Scanner scanner = new Scanner(System.in); 
double x = 0.0d; 

while (true) { 
    try { 
     System.out.println("Gimme a double:"); 

     x = scanner.nextDouble(); 
     break; 
    } catch (InputMismatchException e) {}   
} 

System.out.println(x); 
+1

你永远不应该像你一样吞下异常重新做。至少在那里放置一个打印语句,这样你会看到循环连续执行异常并跳过你的break语句。 – 2013-05-01 00:06:47

+0

我发现通过在catch块中放置打印语句,但我没有看到将它带入示例代码的一点。 – Seralize 2013-05-01 00:08:37

回答

7

如果最初输入了无效的double值,它将变成无限循环。控制然后进入异常块。因为Scanner#nextDouble不消耗新行字符,这些值被反复通过该声明

x = scanner.nextDouble(); 

不挡住具有已经接收的输入传递。这导致无限循环。

应该使用Scanner#nextLine来消费换行符,而不是有一个空的异常块。

} catch (InputMismatchException e) { 
    System.out.println("Error found: " + scanner.nextLine() + " continuing..."); 
} 

使得Scanner#nextDouble线将为IO在下次迭代阻塞。

1

Reimeus正确地说明了为什么发生无限循环。您可以通过在catch块调用scanner.nextLine()修复:

public static void main(String[] args) throws IllegalArgumentException, 
     IllegalAccessException { 
    /* 
    * StackTest t = new StackTest(); 
    * 
    * for(Field f :t.getClass().getDeclaredFields()){ 
    * System.out.println(f.get(t)); } 
    */ 

    Scanner scanner = new Scanner(System.in); 
    double x = 0.0d; 

    while (true) { 
     try { 
      System.out.println("Gimme a double:"); 

      x = scanner.nextDouble(); 
      break; 
     } catch (InputMismatchException e) { 
      scanner.nextLine(); 
     } 
    } 

    System.out.println(x); 
} 
2

根据的Javadoc Scanner#nextDouble,字符不消耗,如果转换为double没有成功(但他们如果转换成功):

将输入的下一个标记扫描为double。如果下一个标记不能被翻译为 有效的double值,则此方法将抛出 InputMismatchException。如果翻译成功,则扫描仪 前进超过匹配的输入。你的程序的

输出示例:

$ java Main 
Gimme a double: 
3.5 
3.5 
$ java Main 
Gimme a double: 
blah 
Gimme a double: 
Gimme a double: 
Gimme a double: 
Gimme a double: 
Gimme a double: 
Gimme a double: 
(Infinite loop here) 

你必须自己消费的特点,最好在异常处理:改变程序的

} catch (InputMismatchException e) { 
    System.out.println("Not a double: " + scanner.nextLine()); 
} 

输出示例:

$ java Main 
Gimme a double: 
blah 
Skipped Past: blah 
Gimme a double: 
3.56 
3.56 
相关问题