簡體   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