2011-04-09 81 views
2

嘿家伙我有以下while while循环似乎不停止。它应该要求用户一个小时。我试图在用户没有输入数字的情况下捕捉事件。while循环中的错误。它不会停止Java

即 输入小时:富 你没有输入有效的值

应该然后允许用户再次输入小时值,但它一直在打印错误消息,并在

private static void setTime(Clock clock){ 
     int hours = -1; 
     int minutes = -1; 
     int seconds = -1; 

     Scanner scanner = new Scanner(System.in); 

     while(true) 
     { 
      try{ 
       System.out.print("Enter hours: "); 
       hours = scanner.nextInt();   
      } 
      catch(NumberFormatException nfe){ 
       System.out.println("Input was not an integer, please try again"); 
       continue; 
      } 
      catch(InputMismatchException ims){ 
       System.out.println("Input was not an integer, please try again"); 
       continue; 
      } 
      break; 
     } 
} 

回答

4

Scanner scanner = ...移动到while循环中。

+0

谢谢,作品。那么为什么它有必要在while循环中? – Tony 2011-04-09 17:11:48

+0

所做的只是让你有十亿扫描仪。它根本没有性能优势。 – corsiKa 2011-04-09 17:13:36

+0

@Tony答案在于你的问题的文档和其他答案。你应该阅读它们。 – krtek 2011-04-09 17:15:09

1

打印异常后,您可以添加scanner.nextLine();

要明确:

try{ 
       System.out.print("Enter hours: "); 

       hours = scanner.nextInt();   
      } 
      catch(NumberFormatException nfe){ 
       System.out.println("Input was not an integer, please try again"); 
       scanner.nextLine(); 
       continue; 
      } 
      catch(InputMismatchException ims){ 
       System.out.println("I--nput was not an integer, please try again"); 
       scanner.nextLine(); 
       continue; 
      } 
      break; 
+0

如果你在同一行上有几小时,几分钟和几秒钟,这将是一个坏主意。我不完全确定你为什么要这样做...... – corsiKa 2011-04-09 17:12:20

+0

如果他所得到的只是几个小时,并且反正抛出异常,这并不是一个坏主意。我运行相同的代码,而不是一个单独的功能,但在主要和获得相同的结果。为什么?我不确定,但可能是因为它将打印的错误导入扫描仪。 – MByD 2011-04-09 17:15:06

1

你试过从扫描仪读取为字符串,然后再尝试分析它作为一个整数?

例如

String line = scanner.nextLine(); 
hours = Integer.parseInt(line); 
+0

这并不具有相同的效果。如果这条线是“12 13 14”,它会炸毁你。您也无法访问您的分钟和秒钟。 – corsiKa 2011-04-09 17:13:08

+0

扫描仪的分隔符可以更改为空格,然后使用scanner.next()而不是scanner.nextLine()。然后可以在每个值上使用Integer.parseInt。 – 2011-04-09 17:16:21

+0

默认值已经是空格。 – corsiKa 2011-04-09 17:17:53

2

从文档:

当使得它可以 检索或经由某些跳过扫描器抛出 InputMismatchException时,扫描仪 不会通过引起 异常的标记,其他 方法。

在重新启动循环之前,您必须阅读错误的答案,否则它会一次又一次地读取相同的内容。

并根据文档nextInt()永远不会返回NumberFormatException,所以没有必要对它进行测试。

您也可以使用hasNextInt()这样的:

while(true) { 
    if(scanner.hasNextInt()) { 
     hours = scanner.nextInt(); 
     break; 
    } else { 
     scanner.next(); 
     System.out.println("You must enter an integer"); 
    } 
} 
+0

如果用户输入“F 3”并按下回车键,那么这是不是应该取得3? – corsiKa 2011-04-09 17:25:57

1

这是因为scanner.nextInt()移动到下一个标记只有当解析成功(见的Javadoc)。