2017-04-02 96 views
0

所以我有一個方法getInput,它的意思是,要求用戶輸入,使用try-catch確保它是一個正確的數據類型(在這種情況下爲int)並驗證它是否在預定義的範圍內。問題是,當我輸入一個字符串時,它會重複輸入不正確的消息,在try {}中輸出我要求輸入的消息,並直接捕獲而無需等待輸入。 下面的代碼:while循環try-catch塊不會在循環後等待try塊中的輸入一次

public static int getInput(String message, int lowerLimit, int upperLimit) { 
    while (true) { 
     int input; 
     try { 
      System.out.println(message); 
      input = scanner.nextInt(); 
      if (lowerLimit > input && input > upperLimit) { 
       return input; 
      } else { 
       System.out.println("Incorrect input value, try again"); 
      } 
     } catch (Exception e) { 
      System.out.println("Incorrect input, try again"); 
     } 
    } 
} 

我知道還有其他工作實現這一點的方式,但我想知道爲什麼這一次不工作 - 我認爲它應該。有任何想法嗎?

+1

'scanner'的定義是什麼? –

+0

此答案應該可以幫助你:http://stackoverflow.com/a/15973109/1291717 –

回答

2

你觀察的行爲從這樣一個事實掃描器(假設你與java.util.Scanner一起工作)僅在nextInt()成功時纔會前進。這意味着您在繼續之前必須跳過錯誤的輸入(即使用next())。

3
if (lowerLimit > input && input > upperLimit) 

這總是false。你的意思是

if (input >= lowerlimit && input <= upperLimit) 
    return input; 
+0

Nit:並不總是。如果'lowerLimit> upperLimit'呢?我的意思是,這在邏輯上是不正確的,但這並沒有明確的阻止... –

+0

謝謝,你是對的 - 這不是問題的原因。 – Nech

0

假設你正在使用Scanner類,你可以檢查,令牌是否int與否

if(scanner.hasNextInt()){ 
    int input = scanner.nextInt(); 
    if (lowerLimit > input && input < upperLimit) { 
    return input; 
     } 
    } 
    else 
    { 
     System.out.println("Incorrect input value, try again"); 
    }