2015-09-19 105 views
1

我目前正在研究Eclipse中的一些Java代碼,並試圖在do-while語句中使用try-catch語句。我當前的代碼如下:Java Do while語句在Try Catch語句後無限循環

import java.util.Scanner; 
import java.util.InputMismatchException; 
import java.util.Random; 
public class GG_HighLowInvalid{ 

    public static void main(String[] args){ 

     Scanner cg = new Scanner(System.in); 

     //Assign and define variables 
     int guess, rand; 
     guess = 0; 
     rand = 10; 

     //Create loop 
     do 
      try{ 
       guess = 0; 
       //Ask for a guess 
       System.out.print("Enter your guess: "); 

       //Record the guess 
       guess = cg.nextInt(); 
      } 
      catch(InputMismatchException exception){ 

       System.out.println("Your guess must be an integer."); 

      } 
     while (guess != rand); 


    } 
} 

當我把在任何號碼,代碼工作正常,並會循環問另一個輸入和輸入10時,該代碼將停止,因爲它應該是(因爲猜測等於rand)。但是,如果我輸入的內容不是整數(例如「否」),則會在輸出打印以下內容時發生無限循環:

「您的猜測必須是整數。」

「輸入你的猜測:你的猜測必須是一個整數。」

「輸入你的猜測:你的猜測必須是一個整數。」

「輸入你的猜測:你的猜測必須是一個整數。」

永遠重複,直到程序外部終止。

由於while語句是(guess!= rand),爲什麼非整數會導致這個無限循環? try-statement下的手動輸入不應該再次被調用嗎?任何幫助理解這一點將不勝感激。另外,我對Java很新,所以如果我遇到簡單的問題,很抱歉。

+0

您是否試過使用調試器來查看'guess'和'rand'的值,當它通過'while'條件評估時? – Anatoly

+0

事實上,你輸入一個非整數並不影響'guess'是一個'int',無論如何,值爲'0'(或者你最近的猜測)。因此,如果以前持有'guess!= rand',它仍然成立。然而,真正的問題是'Scanner'對象在不詢問新的請求的情況下會一直讀取相同的輸入。這是通過@Task的回答解決的。 – Eusebius

回答

4

當掃描器拋出InputMismatchException,掃描儀將不 傳遞引起異常,這樣它可以被檢索 或通過某些其它方法跳過令牌。

目前,您的Scanner不會繼續讀取下一個輸入,而是連續讀取相同的數據。你必須明確地調用一些可以讀取這個不正確的值的方法,該方法不是預期的。例如,scanner.next()調用中的catch塊可以避免這種無限循環。

+1

謝謝,這非常有幫助,因爲我不知道掃描儀正是以這種方式工作的!如果我能接受答案,我會在5分鐘後回來,並確保將其標記爲正確。 –

+0

@ScottT如果遇到問題,最好研究相關類的Javadoc。這是['Scanner']記錄的文件(http://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html) –

1

你不需要使用try catch語句。您只需使用對象掃描程序的hasNextInt()方法檢查它是否爲整數。這是一個例子,它會解決你的問題:

public static void main(String[] args) { 
    Scanner cg = new Scanner(System.in); 
    boolean valid = false; 
    //Assign and define variables 
    int guess, rand; 
    guess = 0; 
    rand = 10; 

    //Create loop 
    do{ 
     System.out.println("Enter your guess: "); 
     if(cg.hasNextInt()){ 
      guess = cg.nextInt(); 
      valid = true; 
     }else{ 
      System.out.println("Your guess must be an integer."); 
      cg.next(); 
     } 
    }while (!valid || guess != rand); 
} 
1

使用下面的代碼:

 catch(InputMismatchException exception){ 
       cg.next(); 
       System.out.println("Your guess must be an integer."); 

     } 

後您已成功讀取的緩衝其價值還沒有被清空,下次當它來到cg.nextInt()它試圖讀取相同的wrong value,你去循環。您需要「清空緩衝區」,以便下次讀取正確的值。

-2

嘗試在catch塊中重置變量「guess = 0」。