2015-10-31 1 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. Вам нужно добавить блок else после' if (inVal> = 1 && inVal <= 4) ' блок для этого. Кроме того, 'int inVal = Integer.parseInt (inValue);' должен находиться внутри блока try, иначе блок catch не будет иметь эффекта. Я не знаю, почему вы получаете «IndexOutOfBoundsException», после изменения кода немного все работает для меня. –

+0

Есть ли особая причина для использования обработки исключений в качестве управления потоком? На самом деле это не хороший стиль. Я бы проверил ввод с некоторым регулярным выражением, по крайней мере, сделав «TryParse» вместо того, чтобы сделать бросок, что приводит к исключению в блоке catch. – Kai

+0

Это единственный метод, с которым я знаком, и я спешу завершить этот проект. Вот почему я не искал лучших способов обработки исключений. Спасибо, что указали на это. Я буду исследовать другие методы для будущих проектов. –

ответ

3

Проблема здесь:

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

Без скобок, только v = inVal; находится под если заявление. Поэтому, независимо от того, 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.

Смежные вопросы