2015-10-31 81 views
0

的數量對話框檢查我工作的一種紙牌遊戲與玩家1-4。當我開始一款新遊戲時,它會實例化一個類DialogCreator,要求你輸入你想要的玩家人數。下面是DialogCreator代碼:Java Swing應用程序,在範圍

private class DialogCreator { 
    /** 
    * Creates a dialog for the input of how many players you want in the game. 
    * Takes an integer between 1 and 4. 
    * @param msg 
    * @return 
    */ 
    int createIntDialog(String msg) { 
     String inValue = null; 
     String error_msg = ""; 

     int v = 0; 

     while ((inValue = JOptionPane 
       .showInputDialog(msg + error_msg + ":")) != null) { 
      error_msg = ""; 
      int inVal = Integer.parseInt(inValue); 
      try { 
       if(inVal >= 1 && inVal <= 4) 
        v = inVal; 
       break; 
      } catch (NumberFormatException nfe) { 
       error_msg = "(Entered values can only be integers between 1 and 4)"; 
      } 
     } 
     return v; 
    } 
} 

我認爲這個代碼將嘗試v = inVal只有1 <= inVal>= 4設置,如果inVal是< 1> 4它會去追趕,並給我的錯誤信息。這不工作,我得到一個IndexOutOfBoundsException如果我輸入一個數字,是不是1〜4。工作正常檢查,如果我進入一個String不能被解析爲int。有人能告訴我我在這裏做錯了嗎?

+0

只有當您不輸入整數時纔會更改錯誤消息,如果'inVal'爲<1 or > 4.您必須在if = 1 && inVal <= 4)之後添加else塊'阻止爲了做到這一點。此外,'int inVal = Integer.parseInt(inValue);'應該在try塊內,否則catch塊不起作用。我不知道爲什麼你得到一個'IndexOutOfBoundsException',改變你的代碼後,一切都適用於我。 –

+0

您是否有特別的理由將異常處理用作流量控制?這其實不是什麼好風格。我會用一些正則表達式來檢查輸入,至少使'TryParse'成爲會導致catch塊中異常的強制轉換。 – Kai

+0

這是我熟悉的唯一方法,我急於完成這個項目。這就是爲什麼我沒有尋找更好的方法來處理異常。感謝您指出它。我將研究未來項目的其他方法。 –

回答

3

的問題是在這裏:

if(inVal >= 1 && inVal <= 4) 
    v = inVal; 
break; 

沒有任何支撐,只有v = inVal;是if語句下。因此,不管inVal是什麼,你將跳出while循環並返回0(v初始化爲0)。然後我猜如果這個方法返回0,你的代碼的其餘部分將失敗。如果加括號身邊,那麼你可以放心,你將打破只有當輸入是有效的:

if(inVal >= 1 && inVal <= 4) { 
    v = inVal; 
    break; 
} 

作爲一個側面說明,你應該和你的namings一致:error_msg不尊重的Java命名約定。

+0

謝謝!這解決了問題。另外,我會記住你的旁註,再次感謝。 –

2

一種更簡單的解決方案是隻使用一個JOptionPane用含有1-4值的組合框。那麼不需要進行任何編輯檢查。

閱讀本教程上Getting User Input From a Dialog一節顯示如何做到這一點的例子。

或者,如果你想堅持讓用戶輸入一個數字,那麼教程還包含一個關於Stopping Automatic Dialog Closing的部分,這有點複雜,但是對於使用JOptionPane更好的整體解決方案。