2012-04-28 37 views
0

我試圖讀取一個開關盒選項的數字,但我堅持一個例外。我會嘗試更好地解釋代碼中的問題:無限循環與java代碼,掃描器對象緩衝區可能是

do{ 
    try{ 
     loop=false; 
     int op=teclado.nextInt(); 
     //I tryed a teclado.nextLine() here cause i saw in other Q but didn't work 
    } 
    catch(InputMismatchException ex){ 
     System.out.println("Invalid character. Try again."); 
     loop=true;//At the catch bolck i change the loop value 
    } 
}while(loop);//When loop is true it instantly go to the catch part over and over again and never ask for an int again 

當我鍵入它完美int,但異常使它重新開始。第二次,程序不要求int(我認爲它可能是一個緩衝區,我需要C中的fflush(stdin)),並且緩衝區開始像瘋了一樣寫。

+0

您正在閱讀的文件的格式是什麼?這可能是它絆腳石不是一個整數(這就是爲什麼會引發'InputMismatchException'。 – Makoto 2012-04-28 04:57:44

+0

我正在從鍵盤讀取「Scanner teclado = new Scanner(System.in);」 – 2012-04-28 04:58:42

+0

您是否使用了同樣的掃描器在進入do-while循環之前? – 2012-04-28 05:02:59

回答

1

catch內部創建Scanner的新實例可以很好地服務您,以便在您失敗時獲得輸入。編輯:當您失敗時,您可以使用Scanner.nextLine()超過換行符。一個do...while循環可能不適合這個,因爲它保證它將至少執行一次。

一個可以幫助你更多的構造是一個簡單的while循環。這實際上是一個while-true-break循環類型,它在有效輸入中斷開。

while(true) { 
    try { 
     op=teclado.nextInt(); 
     break; 
    } catch(InputMismatchException ex){ 
     System.out.println("Invalid character. Try again."); 
     teclado.nextLine(); 
    } 
} 
+0

你是什麼意思?op == new Integer(op)'?'op'已經聲明爲'int',只是使用'break'而沒有任何驗證。 – 2012-04-28 05:13:08

+0

是的,我也在想這個,看起來很沒意思。謝謝你,@ Eng.Fouad! – Makoto 2012-04-28 05:13:58

+0

還有一件事,沒有必要創建新的掃描器每次只使用'teclado.nextLine();'。基本上,問題是因爲用戶在緩衝區中有一個'\ n'字符(按Enter鍵後),並且爲了解決問題,可以丟棄換行符與'teclado.nextLine();'。無論如何,你值得+1 :) – 2012-04-28 05:17:53