[英]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
,您將進入下一個迭代; 這只能循環使用。 break
: break
,您將結束循環或switch
語句的執行。 例如,如果您break;
而不是return h omeNum;
循環將在這里結束。 throw new Exception("Foobar")
: throw
錯誤時,它將退出當前的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,則應該讀一下,因為我認為您做的不正確。 存在一些GUI組件,這些組件為您處理繁瑣的輸入轉換。
甚至,而不是JOptionPane
,您應該依賴System.in
和Scanner
:在終端/控制台中執行代碼,然后在某個輸入窗口中被詢問,然后再回到終端/控制台中,這很奇怪。 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.