2011-04-09 88 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)。