2015-04-13 4 views
1

Я пытаюсь создать линкор. Здесь я хочу получить вход с консоли с помощью Scanner, чтобы определить место для съемки.Проблемы с фильтром Java Filter

while (x) { 
    while (counter) { 
     userInput = input.nextLine(); 
     if (userInput.equals("cheat")) { 
      cheat = true; 
     } 

     uppercased = userInput.toUpperCase(); 
     char[] c = uppercased.toCharArray(); 

     if (uppercased.length() < 2) { 
      System.out.println("Error, invalid input9, try again"); 
      break; 
     } else if (uppercased.equals("")) { 
      System.out.println("Error, invalid input1, try again"); 
      break; 
     } else if (uppercased.length() > 2) { 
      System.out.println("Error, invalid input2, try again"); 
      break; 
     } else if (c[0] < 65 || c[0] > 74) { 
      System.out.println("Error, invalid input3, try again"); 
      break; 
     } else if (c[1] < 48 || c[1] > 57) { 
      System.out.println("Error, invalid input4, try again"); 
      break; 
     } else { 
      code = uppercased; 
      target = map.get(uppercased); 
      targetPosition = target.getSymbol(); 
      if (targetPosition != 46) { 
       System.out.println("You have shot here, try again"); 
       break; 
      } 
     } 
     counter = false; 

    } 
    x = false; 
    code = uppercased; 
} 

проблема, когда я даю неправильный ввод, он не просит о новом входе, но он будет выполнять остальную часть моей программы.

Предполагается фильтровать входные данные так: «A1» , который используется для определения места для съемки. Как я могу отфильтровать неправильный ввод и получить новый вход?

+3

Подсказка: Идите прочитать о том, что делать 'break' заявления. – PakkuDon

+0

Не могли бы вы описать, что должен делать этот код? – Sildoreth

ответ

0
  • , используя break, переместит вас за пределы токовой петли.

  • с использованием continue, переместит вас в начало токовой петли.

Так что в вашем случае продолжение будет лучше, потому что оно переместит вас в часть кода, где вы читаете вход во внутренний цикл.

Извлечение основного корпуса из этого цикла (как показано ниже), также было бы легко проверить :)

Обновление:

while (x) { 
    while (!runCheck()) { Your main method is extracted from loop, making it more readable 
    } 
    x = false; 
    code = uppercased; 
} 

boolean runCheck(){ 
     userInput = input.nextLine(); 
     if ("cheat".equals(userInput)) { // prefer to compare String agains a constant in this way, it's immune to NPE, when by any chance userInput would be a null 
      cheat = true; 
     } 

     uppercased = userInput.toUpperCase(); 
     char[] c = uppercased.toCharArray(); 

     if (uppercased.length() < 2) { 
      System.out.println("Error, invalid input9, try again"); 
      return true; 
     } else if ("".equals(uppercased)) { 
     ... 
     } else { 
      code = uppercased; 
      if(!map.conainsKey(uppercased)){ // target can be null, or not existing in map 
       return true; 
      } 
      target = map.get(uppercased); 
      targetPosition = target.getSymbol(); 
      if (targetPosition != 46) { 
       System.out.println("You have shot here, try again"); 
       return true; 
      } 
     } 
     return false; 
} 
+0

Я бы также рекомендовал извлечь внутренний цикл для функции, которая возвращает boolean, которая говорит нам, должен ли этот цикл или не должен выполняться снова, код будет более читабельным :) – Beri

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