2013-07-27 4 views
-2

По какой-то причине эта программа не будет правильно loop, ее предполагается подождать ввода пользователя, а затем принять решение о погоде или нет. Она должна пропустить входную часть пользователя, решая, что он должен loop, затем позволяет учитывать пользовательский ввод.Java не будет правильно зацикливаться

Например, он запрашивает номер, я типа 5, затем он говорит: «Вы хотели бы пойти снова?» «Пожалуйста, используйте либо« да », либо« нет », учитывая регистр!» «Хотели бы вы снова пойти?» После того, как он запустил, он будет принимать пользовательский ввод, я подумал об использовании сна (2000), но я не хочу, чтобы он просто пропустил и предположил, что пользователь не поставил ничего в. Я в тупике! имейте в виду, что это мой второй день работы с java. Я newbie, и это только третья программа, над которой я работаю. У меня была эта проблема в другой программе, но мне удалось исправить ее просто отлично. Однако этот, похоже, не хочет работать одинаково, несмотря на то, что я сделал фреймворк точно так же.

do { 
       System.out.println("would you like to go again?"); 
       if (input.hasNextLine()){ 

        again = input.nextLine(); 
        if (again.equals("yes")){ 
         yon2 = false; 
         dateconverter.main(args); 
        }else if (again.equals("no")){ 
         System.out.println("good bye"); 
         Thread.sleep(4000); 
         System.exit(0); 
        }else{ 
         yon2 = true; 
         System.out.println("Please use either yes or no. caps sensative!"); 
        } 
       } 
      } while (!(yon2 = false)); 
+0

Это не исправит вашу проблему, но ... Вы не должны скрывать тот факт, что вы ожидаете откликов, чувствительных к регистру, до тех пор, пока пользователь не совершит неосознаваемую ошибку. Расскажите им, что вы от них ожидаете - пример не повредит - или еще лучше справиться с ситуацией за кулисами и позволить пользователю вводить что-либо родственное, как 'YeS'! – ChiefTwoPencils

ответ

6

Java-петли правильно. Однако yon2 = false - это присвоение, а не сравнение.

Таким образом, цикл эквивалентно:

do { 
    // .. 
    yon2 = false; // assign! :(
} while (!yon2); 

Так Java делает именно то, что было сказано сделать.

Теперь, с учетом этого, я считаю, что другая проблема путается в использовании переменных. Рассмотрим это:

boolean askAgain = true; 
do { 
    System.out.println("would you like to go again?"); 
    if (input.hasNextLine()){ 
     String again = input.nextLine(); 
     if (again.equals("yes")){ 
     // Finally done asking 
     askAgain = false; 
     dateconverter.main(args); 
     } else if (again.equals("no")){ 
     System.out.println("good bye"); 
     Thread.sleep(4000); 
     System.exit(0); 
     } else { 
     // If we're here, we still need to ask again 
     System.out.println("Please use either yes or no. caps sensative!"); 
     } 
    } else { 
     // no more lines! do something sensible 
     System.exit(0); 
    } 
    // Loop while we need to ask again! 
    // Note that the negative is removed 
} while (askAgain); 

Однако, принимая второй реорганизовать это позволяет что-то легче читать позже и избегает дело с флагом целиком:

boolean promptKeepPlaying (Scanner input) { 
    while (input.hasNextLine()){ 
     System.out.println("would you like to go again?"); 
     String again = input.nextLine(); 
     if (again.equalsIgnoreCase("yes")){ 
     return true; 
     } else if (again.equalsIgnoreCase("no")){ 
     return false; 
     } else { 
     System.out.println("Please use either yes or no."); 
     } 
    } 
    // no more lines 
    return false; 
} 

// somewhere else 
if (promptKeepPlaying(input)) { 
    // restart game 
    dateconverter.main(args); 
} else { 
    // exit game 
    System.out.println("good bye"); 
    Thread.sleep(4000); 
    System.exit(0); 
} 
+0

или если пользователь должен иметь 'while (! (Yon2 == false));' – ObieMD5

+0

@ ObieMD5 - программа выполняет то, что было сказано, * независимо от того, что означал программист *. –

+0

== == В любом случае это лишнее. –

0

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

Однако реальный урок здесь является то, что вы не должны писать громоздкие == и != испытания с участием булевых. Есть более простые, более элегантные и меньше ошибок, подверженных способам написания тестов. Например, если предположить, что condition является булевым.

  • condition == true так же, как condition
  • condition == false так же, как !condition
  • !(condition == false) так же, как condition
  • condition == condition2 так же, как !(condition^condition2) .

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


1 - Это пример, где == изящнее ... но исключающий или оператор ^ избегает случайной ловушки назначения.

+0

жаль, что вы правы обо всем этом, имейте в виду, я только что начал Java вчера, так что я немного новичок на нем. Я только что закончил highschool без каких-либо других формальных тренировок по кодированию, проходящих мимо html, поэтому его немного сложно узнать обо всех api и о том, как они функционируют. даже то, что вы говорите, должно быть принято здравым смыслом, им делать это очень поздно ночью, так что здравый смысл не применяет LOL. это все опыт обучения, поэтому я ценю, что вы даете мне этот совет. – user2620255

+0

Как говорится ... «здравый смысл не такой общий». И я рад, что вы оценили мой совет. Это то, что хорошо учиться на раннем этапе, и болезненная ошибка может помочь укрепить урок. –

+0

Добавление к примечанию: я бы сказал, что читаемость важнее, чем избегать случайной ловушки назначения (тем более, что это не проблема: p). Таким образом, не используйте побитовые/логические операторы, если вам не нужно. Чтение каждого логического значения как «истина» или «ложь» - это то, как вы можете вести себя через все это. 'if (true)' beats 'if (true == true)' – keyser

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