2014-09-01 67 views
0

所以我所要做的是讓用戶輸入一個矩陣的有效協調,這是一個INT是大於-1,用try和catch JAVA無限循環

Scanner scanner = new Scanner (System.in); 
int coordinates[] = new int[2]; 
coordinates[0]=-1; 
coordinates[1]=-1; 
boolean check = true; 
while (((coordinates[0]<0)||(coordinates[0]>R)) && check) { 
    System.out.print("Please enter a valid row number:\t"); 
    try { 
     coordinates[0]=scanner.nextInt(); 
     break; 
    } 
    catch (InputMismatchException e) { 
    } 
} 
while (((coordinates[1]<0)||(coordinates[1]>C)) && check) { 
    System.out.print("Please enter a valid col number:\t"); 
    try { 
     coordinates[1]=scanner.nextInt(); 
     break; 
    } 
    catch (InputMismatchException e) { 
    }  
} 

問題它進入一個無效的輸入 INT R後無休止地循環是行 INT C的大小是collumn

+0

這就是爲什麼我把break ?,所以,我認爲,一旦存儲完成,程序就會離開 – dumas 2014-09-01 09:28:06

+0

爲什麼你甚至有檢查標誌? – john 2014-09-01 09:29:03

+0

另外,什麼是R&C? – Pranalee 2014-09-01 09:29:05

回答

1

你的問題是你沒有處理你正在捕捉的錯誤。 如果您提供nextInt()方法的數字格式錯誤,那麼InputMismatchException將爲thrown。然後因爲catch什麼都不做,循環將繼續(從begining開始)和掃描儀將讀取相同的不正確的值,依此類推......

所以不是這樣的:

catch (InputMismatchException e) { 
} 

試試這個:

catch (InputMismatchException e) { 
    System.out.println("Wrong number entered."); 
    scanner.nextLine(); 
} 

這樣你就會強制scanner移過最後一個不正確的輸入。

編輯:

你循環也斷了,因爲你做break讀取輸入後。在這種情況下,如果你將負數放在break之內,也不會檢查循環條件。取出break聲明,它會按預期工作:

while (((coordinates[0]<0)||(coordinates[0]>R)) && check) { 
    System.out.print("Please enter a valid row number:\t"); 
    try { 
     coordinates[0]=scanner.nextInt(); 
    } 
    catch (InputMismatchException e) { 
     System.out.println("That's not a valid number."); 
     scanner.nextLine(); 
    } 
} 

EDIT2:

public static void main(final String args[]) 
{ 
    int maxRowsNumber = 10; 
    int maxColsNumber = 10; 
    Scanner scanner = new Scanner (System.in); 
    int coordinates[] = new int[2]; 
    coordinates[0]=-1; 
    coordinates[1]=-1; 
    boolean check = true; 
    while (((coordinates[0]<0)||(coordinates[0]>maxRowsNumber)) && check) { 
     System.out.print("Please enter a valid row number:\t"); 
     try { 
      coordinates[0]=scanner.nextInt(); 
     } 
     catch (InputMismatchException e) { 
      System.out.println("That's not a valid number."); 
      scanner.nextLine(); 
     } 
    } 
    while (((coordinates[1]<0)||(coordinates[1]>maxColsNumber)) && check) { 
     System.out.print("Please enter a valid col number:\t"); 
     try { 
      coordinates[1]=scanner.nextInt(); 
     } 
     catch (InputMismatchException e) { 
      System.out.println("That's not a valid number."); 
      scanner.nextLine(); 
     }  
    } 
    System.out.println("Inserted RowsNumber: " + coordinates[0]); 
    System.out.println("Inserted RowsNumber: " + coordinates[1]); 
} 

輸出:

Please enter a valid row number: 11 
Please enter a valid row number: 22 
Please enter a valid row number: 10 
Please enter a valid col number: 11 
Please enter a valid col number: 2 
Inserted RowsNumber: 10 
Inserted RowsNumber: 2 
+0

先生,我現在遵循了您的建議,我的問題是接受負整數,您能幫我解決這個問題嗎? – dumas 2014-09-01 09:41:28

+0

當然,我可以,但首先你必須回答評論中的問題 - 什麼是R&C? – 2014-09-01 09:44:05

+0

int R是行的大小int C是列的大小,R和C將由用戶輸入,這將是他所需矩陣的大小 – dumas 2014-09-01 09:48:07

1

的大小如果爲「無效輸入」你的意思是「沒有任何一種整數」,然後您的掃描儀每次嘗試讀取另一個整數時都會失敗,因此您會打到catch,並且無法停止循環。也許你打算在這種情況下將check設置爲false?或者,也許你打算把break放在每個catch

使用break有效的整數被讀取是不正確的,因爲它可能是一個負整數,你的循環後衛說你不想要。

0

這是基本相同,你做什麼,我只是試圖通過去除硬編碼值,使變量更具描述性,幷包括輸入驗證來改進它。

final int ROW = 0; 
final int COL = 1; 

int coordinates[] = new int[2]; 
coordinates[ROW] = -1; 
coordinates[COL] = -1; 
boolean isInputValid = true; 

Scanner scanner = new Scanner(System.in); 
do { 
    try { 
     System.out.print("Please enter a valid row number:\t"); 
     coordinates[ROW] = Integer.parseInt(scanner.nextLine()); 
    } catch (NumberFormatException nfe) { 
     isInputValid = false; //if the input is not int 
    } 
} while (!isInputValid && (coordinates[ROW] < 0) //do this until the input is an int 
     || (coordinates[ROW] > R));    //and it's also not less than 0 or greater than R 


//same logic applies here 
do { 
    try { 
     System.out.print("Please enter a valid col number:\t"); 
     coordinates[COL] = Integer.parseInt(scanner.nextLine()); 
    } catch (NumberFormatException nfe) { 
     isInputValid = false; 
    } 
} while (!isInputValid && (coordinates[COL] < 0) 
     || (coordinates[COL] > C)); 

希望這會有所幫助。