2013-05-01 125 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 
相關問題