Java做while循环不循环

时间:2014-09-29 20:41:56

标签: java loops do-while

到目前为止,我在课本的教科书中已经阅读过,在我班级的模块中,在2个多小时的搜索中,我无法弄清楚为什么我的代码不起作用。 main方法中的do while循环正常工作,但get方法中的do while循环不循环。我输入错误的数字,我收到错误消息,然后再次询问该号码,它继续前进到下一个get方法。

我希望这是一件我忽略的简单事情,但我很感激我能得到的任何帮助。

以下是我的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);

调用此方法的main方法中的代码:

 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天的时间来完成这项任务。 提前感谢您的帮助:)

2 个答案:

答案 0 :(得分: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。也许那就是设计;也许是疏忽。我不知道。

答案 1 :(得分: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"):当您throw出现错误时,它将退出当前try .. catch块方法,并匹配异常类型。

作为breakthrowcontinue

的示例
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.inScanner:在终端/控制台中执行代码,然后在窗口中询问是很奇怪的在某些输入上,然后返回终端/控制台。