2013-04-06 48 views
3

對於學校中的項目,我試圖使用try/catch來防止程序在用戶輸入字母而不是所需的輸入類型時崩潰(即,雙)。在使用Try/Catch時,Java陷入死循環

public static double inputSide() { 
    Scanner in = new Scanner(System.in); 
    double side = -1; 
    do { 
     try { 
     System.out.println("Enter a side length (in units):"); 
     side = in.nextDouble(); 
     } 
     catch(InputMismatchException e){ 
      System.out.println("Must input number"); 

      } 
    } while (side < 0); 
    return side; 
} 

當我執行該代碼時,它會停留在一個循環,它輸出「輸入一個邊長(在單位):」和「必須輸入數字」無限。我是使用try/catch的新手,所以我可能只是不熟悉這種行爲。無論如何,如果有人能幫我弄清楚這個問題,那將非常感激。提前致謝。

回答

4

你必須釋放緩衝區,如果你有一個錯誤的輸入,在catch塊中加入這一行:

in.next(); 

,一切都應該工作:

public static double inputSide() { 
    Scanner in = new Scanner(System.in); 
    double side = -1; 
    do { 
     try { 
      System.out.println("Enter a side length (in units):"); 
      side = in.nextDouble(); 
     } 
     catch(InputMismatchException e){ 
      System.out.println("Must input number"); 
      //this line frees the buffer 
      in.next(); 
     } 
    } while (side < 0); 
    return side; 
} 

今後,可以考慮使用

if(in.hasNextDouble()){ 
    //read 
} 

代替try-catch塊

+0

非常感謝!我們正在研究in.hasNextDouble()方法。 – 2013-04-06 18:54:58

+0

@ClementHoang不客氣!看看[java.util.Scanner API](http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Scanner.html),你會看到有一個每個數據類型都有很多'Scanner#hasNextWhatever()',所以你不需要try-catch塊。我不記得如果你的輸入是錯誤的,它是否也需要無緩衝區,如果它經歷了一個無限循環,它和try-catch一樣是個問題,你用我的答案解決它!如果這對你最好,請點擊答案左邊的「V」符號來「打勾」。:) – BackSlash 2013-04-06 18:59:30

+0

對於其他人閱讀。發生這種情況是因爲當調用異常時,掃描器不會移動到下一個輸入標記,而是嘗試再次讀取它。添加非數據類型特定的.next()移到下一個標記。 – 2016-03-05 03:24:25