2015-10-31 82 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更好的整体解决方案。