2013-12-10 4 views
0

Спецификация проблемы: Бесконечная петля (меню входит в бесконечный цикл);Infinite loop java

Цель: Запросить пользователя для ввода целочисленного значения и действовать в соответствии с указанной логикой внутри кода. Как избежать бесконечного цикла ?;

Код:

public Purchase groceryStoreMenu(LemonadeStand lemonadeStand){ 

    boolean getMenu = true; 
    int userEnteredNumber = -1; 
    currentPurchase = new Purchase(); 

    while(getMenu){ 
     try{ 

      System.out.println("Grocery Store"); 
      System.out.printf("%s\t%s%n%s\t%s%n%s\t%s%n%s\t%s%n%s\t%s%n%s\t%s%n" , "1:" , "Buy lemons", "2:", "Buy cups" , "3:" , "Buy sugar" , 
      "4:" , "Buy ice" , "5:" , "Done"); //change this 
      userEnteredNumber = reader.nextInt(); 

      if (userEnteredNumber == 1) { 
       money = lemonadeStand.profit(0); 
       lemonsMenu(money); 
      }else if (userEnteredNumber == 2){ 
       money = lemonadeStand.profit(0); 
       cupsMenu(money); 
      }else if (userEnteredNumber == 3){ 
       money = lemonadeStand.profit(0); 
       sugarMenu(money); 
      }else if (userEnteredNumber == 4){ 
       money = lemonadeStand.profit(0); 
       iceMenu(money); 

      }else{ 
       money = lemonadeStand.profit(0); 
      dailyGreetingMenu(); 

      } 

     if (userEnteredNumber != 1 && userEnteredNumber !=2 && userEnteredNumber != 3 
      && userEnteredNumber != 4 && userEnteredNumber != 5) { 
    throw new Exception(); 
    } else if(userEnteredNumber == 6) { 
     getMenu = false; 
     //break; 
    } else { 
     getMenu = false; 
     //break; 
    } 

    } 

    catch(Exception e) 
    { 
     System.out.println("Error in number format. Enter a valid number from the choices (1,2,3,4,5,6)"); 
    } 

    } 


    return currentPurchase; 
+2

что форматирование просто ... страшно ... Я едва могу прочитать код:/ – Doorknob

+1

reader.nextInt(), вероятно, не блокирует. Я бы начал отлаживать там. – tier1

+0

@ user3053348 вы примете ответ? –

ответ

5

Ваша программа никогда не достигает if(userEnteredNumber == 6) с 6 значение, потому что если userEnteredNumber является 6, то первое условие будет захватить его:

if (userEnteredNumber != 1 && userEnteredNumber !=2 && userEnteredNumber != 3 
     && userEnteredNumber != 4 && userEnteredNumber != 5) { 
    throw new Exception(); 
} 

, то он бросает исключение, и это catch ed в блоке цикла. И любое число, отличное от 1, 2, 3, 4, 5, 6, одинаково. Таким образом, цикл никогда не заканчивается.

Мне совсем не нравится ваш код. Но если вы хотите сделать это таким образом, вы должны добавить userEnteredNumber != 6 для первого, если условие.

0

похоже, что выполнение никогда не войдет в следующий блок: else if (userEnteredNumber == 6) { getMenu = false; // break; }

условие if не должно содержать '& &' .it должно было быть '||' Также похоже, что вы не хотите, чтобы ваш пользователь вводил любое число, отличное от 1,2,3,4,5.

if (userEnteredNumber != 1 || userEnteredNumber !=2 || userEnteredNumber != 3 
     || userEnteredNumber != 4 || userEnteredNumber != 5) { 
    getMenu = false;    
    throw new Exception(); 
} 
+0

Это ответ или просто оскорбительный комментарий к коду? – nhgrif

+0

Мне показалось, что я тоже понял. что я могу сказать. – Ashish

+0

Ваш ответ оскорбителен, неуверен и не дает четкого объяснения ответа. Если вы назовете код ужасным, просьба уточнить, почему его ужасно и обеспечить лучший альтернативный пример. Когда вы говорите «я думаю, что это должно было быть ...», вы не уверены. Если вы не уверены, не отправляйте ответ. – nhgrif