2011-06-16 71 views
2
import java.util.*; 

public class June16{ 
    public static void main(String[] args){ 
     Scanner kb = new Scanner(System.in); 
     double b=0; 
      boolean checkInput = true; 
     do{ 
      try{ 
       System.out.println("Input b : "); 
       b = kb.nextDouble(); 
       checkInput = false; 
      }catch(InputMismatchException ime){ 
      } 
     }while(checkInput); 
    } 
} 

在拋出InputMismatchException之後,爲什麼我的程序不提示輸入? :Djava.util.Scanner:爲什麼我的nextDouble()不提示?

回答

4

documentation

當掃描器拋出InputMismatchException時,掃描儀將無法通過令牌導致異常,以便它可能被檢索或s通過其他一些方法進行發送。

這就是爲什麼你最終在無限循環,如果你沒有輸入一個有效的雙。處理異常時,請移至kb.next()的下一個標記。

2

因爲如果Scanner.nextDouble()失效,它會將令牌留在隊列中(然後再次讀取該令牌,導致令牌一遍又一遍地重複)。

嘗試以下操作:

try { 
    // ... 
} catch (InputMismatchException ime) { 
    kb.next(); // eat the malformed token. 

}

ideone.com demo illustrating working example

+0

排隊15個字符到這裏 – Woot4Moo 2011-06-16 15:47:56

1

這是由於nextDouble將採用您輸入的十進制數字這一事實,但仍然存在您輸入的未被掃描儀讀取的回車符。下一次它循環它讀取輸入,但等待!那裏有回車,所以......不需要掃描任何東西。它只處理回車。當然,程序發現它不是雙重的,所以你會得到一個異常。 你如何解決它?那麼,有什麼能掃描nextDouble留下的剩餘物(即next()),然後再掃描下一個double。

相關問題