2014-09-29 206 views
0

據我迄今爲止在我的教科書中閱讀的課程,在我的課程模塊和2 +小時的搜索,我無法弄清楚爲什麼我的代碼不工作。 主要方法中的do while循環工作正常,但get方法中while循環不循環。我輸入錯誤的號碼,收到錯誤消息,然後再次詢問號碼,然後轉到下一個get方法。Java while while循環不循環

我希望這是簡單的,我忽略了,但我會很感激任何幫助,我可以得到這一點。

這裏是我的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 2014-09-29 20:44:23

回答

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

正因爲如此,你是從該方法在第一循環迭代結束返回。您可能還想要捕獲可能由parseInt調用拋出的潛在NumberFormatException

另外,請注意,這將允許輸入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"):當你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:這是很奇怪的終端/主機執行代碼,然後被要求在一些輸入窗口,以然後回來在終端/安慰。