2014-09-29 3 views
0

Насколько я до сих пор читал в своем учебнике для класса, в модулях для своего класса и в 2 часа работы, я не могу понять, почему мой код не работает. Цикл do while в основном методе работает правильно, но do while while в моих методах get не зацикливаются. Я ввел неправильный номер, я получаю сообщение об ошибке, а затем вместо того, чтобы просить номер снова, он переходит к следующему методу get.Java do while Loops not looping

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

Вот код для моего метода getHome:

public static int getHome() 
{ 

    int homeNum; 
    String home; 
    do 
    { 
     home = JOptionPane.showInputDialog(null,"Enter 1(apartment), 2(house)," 
      + " or 3(dorm).","Dwelling Type", JOptionPane.QUESTION_MESSAGE); 
     homeNum = Integer.parseInt(home); 

     if(!(homeNum == 1) && !(homeNum == 2) && !(homeNum == 3)) 
     {  
      JOptionPane.showMessageDialog(null, "The value for dwelling type " 
       + "must be 1(apartment), 2(house), or 3(dorm)", "Dwelling" 
         + "Type Error", JOptionPane.ERROR_MESSAGE); 

     }    
     return homeNum;   
    } 
    while(homeNum < 0 || homeNum > 3); 

И код в основной метод, который вызывает этот метод:

public static void main(String[] args) 
{ 
    String response; 

    do 
    { 
    petRec(getHome(), getHours()); 
    response = JOptionPane.showInputDialog(null, "Do you want to continue?" + 
      "\nEnter Y for yes and anything else for no.", "Continue?", + 
        JOptionPane.QUESTION_MESSAGE); 
    } 
    while(response.equalsIgnoreCase("y")); 


} 

Просто для уточнения здесь метод petRec:

public static void petRec(int homeType, double hoursAtHome) 
{ 


    String pet; 

     if(homeType == 1 && hoursAtHome >= 10) 
      pet = "Cat"; 
     else 
     if(homeType == 1 && hoursAtHome < 10) 
     pet = "Hamster"; 
     else 
     if(homeType == 2 && hoursAtHome >= 18) 
     pet = "Pot-Bellied Pig"; 
     else 
     if(homeType == 2 && hoursAtHome >= 10 && hoursAtHome <= 17) 
     pet = "Dog"; 
     else 
     if(homeType == 2 && hoursAtHome < 10) 
     pet = "Snake"; 
     else 
     if(homeType == 3 && hoursAtHome > 6) 
     pet = "Fish"; 
     else 
     if(homeType == 3 && hoursAtHome < 6) 
     pet = "Ant Farm"; 
     else 
     pet = "Nothing"; 

    JOptionPane.showMessageDialog(null, "You should get a " + pet + "!", 
      "Recommended Pet", JOptionPane.INFORMATION_MESSAGE); 



} 

В прошлом году я принял интро к Visual Basic и имел бесконечные циклы, в этом году я беру Java и не могу заставить цикл повторять. Метод getHours структурирован почти идентично методу getHome только с различными переменными и формулировкой в ​​подсказке. Программа должна отображать сообщение об ошибке, когда вводится номер, который не является 1, 2 или 3, а затем цикл, чтобы снова запросить номер. Он отображает сообщение об ошибке, но затем продолжает запрашивать часы. Снова я очень ценю любую помощь, которая может быть предложена. Это задание не должно появляться до субботы, но у меня есть только 2 дня для работы над этим. Заранее спасибо за помощь :)

+0

возвращение в петлю? – StackFlowed

ответ

6

return Переместить заявление вне цикла:

public static int getHome() 
{ 
    int homeNum; 
    String home; 
    do 
    { 
     home = JOptionPane.showInputDialog(null,"Enter 1(apartment), 2(house)," 
      + " or 3(dorm).","Dwelling Type", JOptionPane.QUESTION_MESSAGE); 
     homeNum = Integer.parseInt(home); 

     if(!(homeNum == 1) && !(homeNum == 2) && !(homeNum == 3)) 
     {  
      JOptionPane.showMessageDialog(null, "The value for dwelling type " 
       + "must be 1(apartment), 2(house), or 3(dorm)", "Dwelling" 
         + "Type Error", JOptionPane.ERROR_MESSAGE); 

     }    
    } 
    while(homeNum < 0 || homeNum > 3); 
    return homeNum;  
}  

Как это, вы возвращаете из метода в конце первой итерации цикла. Вы также можете поймать потенциал NumberFormatException, который может быть вызван вызовом parseInt.

Также имейте в виду, что это позволит ввести 0. Возможно, это по дизайну; возможно, надзор. Я не могу сказать.

0

Добро пожаловать на Java:

do 
{ 
    ...  
    return homeNum;   
} 
while(homeNum < 0 || homeNum > 3); 

В Java, следующая команда все закончить текущее заявление: код после того, как никогда не будет выполнена, или вы получите сообщение об ошибке. Вы должны переместить return вне цикла для того, чтобы правильно работать (или по назначению):

do 
{ 
    ...  
} 
while(homeNum < 0 || homeNum > 3); 
return homeNum;   
  • return: при возврате значения, как и в обратном homeNum, вы выходите из способа, в котором вы находитесь.
  • continue: когда вы continue, вы перейдете к следующей итерации; это работает только в цикле.
  • break: Когда вы break, вы закончите выполнение цикла или инструкции switch. Например, если бы вы поставили break; вместо return h omeNum;, цикл закончился бы здесь.
  • throw new Exception("Foobar"): когда вы выберете сообщение об ошибке, оно выйдет из текущего метода try .. catch до того, как будет соответствовать вид исключения.

В качестве примера break, throw и continue:

public static int getHome() 
{ 
    int n = -1; 
    for (;;) { // infinite loop powered ! 
    try { 
     String home = JOptionPane.showInputDialog(null,"Enter 1(apartment), 2(house)," 
        + " or 3(dorm).","Dwelling Type", JOptionPane.QUESTION_MESSAGE); 
     int homeRun = Integer.parseInt(home); 
     if(homeNum != 1 && homeNum != 2) && homeNum != 3) { 
     // note: this is an example. You should NEVER use exception in these case 
     throw new IllegalArgumentException("Damn!"); 
     } 
     n = homeRun; 
     break; 

    } catch (NumberFormatException|IllegalArgumentException e) { 
     JOptionPane.showMessageDialog(null, "The value for dwelling type " 
      + "must be 1(apartment), 2(house), or 3(dorm)", "Dwelling" 
        + "Type Error", JOptionPane.ERROR_MESSAGE);  
     continue; 
    } 
    } 
    return n; 
} 

Это некрасиво пример показывает вам четыре инструкции.

  • Бросать исключение в этом случае - это плохая практика. Но он пойдет в блок catch, потому что он ловит NumberFormatException (от Integer.parseInt) и брошен IllegalArgumentException.
  • Перерыв может быть заменен return homeRun;
  • continue бесполезен в этом случае, потому что нет ничего не осталось после try catch блока.

Кроме того, если вы изучаете Java, вы должны, возможно, read that, потому что я думаю, что вы не думаете правильно. Существуют компоненты GUI, которые выполняют громоздкую работу по обработке ввода для вас.

Или даже, вместо JOptionPane, вы должны полагаться на System.in и Scanner: это довольно странно для выполнения кода в терминале/консоли, а затем попросили в окне на некотором входе, чтобы затем вернуться в терминал /консоль.