繁体   English   中英

Java做while循环不循环

[英]Java do while loops not looping

据我到目前为止在班级教科书,班级模块中以及在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天的时间来做这项工作。 预先感谢您的帮助 :)

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;    
}    

照原样,您将在第一次循环迭代结束时从方法中返回。 您可能还想捕获parseInt调用可能引发的潜在NumberFormatException

另外,请注意,这将允许输入0。 也许那是设计使然; 也许是疏忽。 我不知道

欢迎使用Java:

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

在Java中,以下指令全部完成当前语句:之后的代码将永远不会执行,否则您将得到错误。 您必须将return移到循环外才能使其正常运行(或按预期运行):

do
{
    ...      
}
while(homeNum < 0 || homeNum > 3);
return homeNum;        
  • return :当您返回一个值时,例如在return homeNum中,您将退出当前所在的方法。
  • continue :当您continue ,您将进入下一个迭代; 这只能循环使用。
  • breakbreak ,您将结束循环或switch语句的执行。 例如,如果您break; 而不是return h omeNum; 循环将在这里结束。
  • throw new Exception("Foobar")throw错误时,它将退出当前的try .. catch块方法,该方法与异常类型匹配。

作为break的示例, throwcontinue

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,则应该读一下,因为我认为您做的不正确。 存在一些GUI组件,这些组件为您处理繁琐的输入转换。

甚至,而不是JOptionPane ,您应该依赖System.inScanner :在终端/控制台中执行代码,然后在某个输入窗口中被询问,然后再回到终端/控制台中,这很奇怪。 。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM