我的小程序有點問題。
我有一個JOptionPane要求一個數字,如果該數字小于10,則一個循環會一直持續下去,并永遠做下去,繼續詢問數字。 在該循環內,我調用一個方法,將int作為參數。 在該方法中,我需要(不更改調用該方法的類中的任何代碼)找出我輸入的數字是否小于1。如果是,則需要調用另一個方法。 到此為止。
但! mainloop不斷滾動,因此它繼續執行循環中的其他工作。 我需要阻止它執行此操作,因此在方法的if語句中,我需要中斷該方法所在的循環的特定迭代,并使其繼續執行同一循環的新迭代,并要求 新號碼。
第一類(示例):
number=Integer.parseInt( JOptionPane.showInputDialog("bla bla" ) );
while (number !=- 10) {
themethod(number);
blah
blah
...
}
調用的方法(示例):
public void themethod(int number) {
if (number<1) {
call the other method
break the iteration im in
}
只需返回一些錯誤代碼,并在返回該代碼時中斷循環即可。
您想打破哪個循環? 方法內部是否還有另一個循環?
不更改while循環中的代碼是不可能的。 哪個部分屬于哪個班級,您不能更改哪個班級?
您可以在這里做很多事情。最終,您應該做什么取決于您的編碼風格和您要完成的工作。
選項1是以下內容的一些變體:
for (;;)
{
int number = /* ... */;
myMethod(number);
if (number == -10)
break;
}
您可能會主觀地(取決于情況)說這是不好的,因為在循環中包含了終止條件的知識,而不是進行"實際工作"的方法。也許你的循環沒關系。也許在其他情況下(或與其他程序員一起使用?這在很大程度上取決于個人喜好。)您可能想使myMethod做出該決定。通常,我自己的個人喜好通常傾向于不將場景知識分配到源頭上的各種方法中。
因此,我從這里開始寫的大部分內容將是如何使myMethod決定是否終止。
選項2-myMethod返回一個布爾值,指示我們應該終止:
for (;;)
{
int number = /* ... */;
if (myMethod(number))
break;
}
boolean myMethod(int number)
{
// TODO - do stuff
return number == -10;
}
但是您可能會說myMethod已經想返回其他類型。我非常有C背景,所以我最常使用的慣用法就是" out參數"。引導我進入選項3:
選項3-Out參數讓呼叫者決定終止:
public class CancelIndicator
{
public boolean shouldCancel;
};
CancelIndicator cancel = new CancelIndicator();
while (!cancel.shouldCancel)
{
int number = /* ... */;
myMethod(number, cancel);
}
int myMethod(int number, CancelIndicator cancel)
{
// TODO - do stuff.
cancel.shouldCancel = (number == -10);
return /* ... */;
}
或者,也許您更喜歡例外:
選項3:
public class CancellationException extends Exception
{
}
try
{
for (;;)
{
int number = /* ... */;
myMethod(numberl);
}
}
catch (CancellationException ex)
{
}
void myMethod(int number) throws CancellationException
{
// TODO - do stuff.
if (number == -10)
throw new CancellationException();
}
如您所見,有很多選項。我敢肯定,人們可能會花一整天的時間討論不同的方法。這是我見過的慣用法示例-我會警告您,自從我在Java中做了大量工作以來已經有一段時間了,因此我可能不會在這里編寫最慣用的代碼。 :-)
我認為他不能修改循環的內容,但是只能修改方法。但是無論如何,答案都很好。 +1
謝謝!當我看到"拋出新事物"時,我知道該怎么做。
等待,這樣您就可以一直拋出異常?循環的其余部分是否有一些catch語句?
我似乎錯過了不允許您修改代碼的部分。如果您有一些講師告訴您這一點,我認為他們以非常愚蠢的方式進行教育。就像在說:將其釘牢,但不要使用錘子。
添加一個返回值,指示while應該中斷:
public boolean themethod(int number) {
if(number<1) {
call the other method
return true;
}
return false;
}
然后:
while(number !=-10) {
if(themethod(number)) break;
bla
bla
...
}
編輯:如果您無法更改while代碼,請從方法中引發異常:
public void themethod(int number) {
if(number<1) {
call the other method
throw new RuntimeException("Negative Number");
}
}
我不能更改循環所在類的代碼,也不能更改方法的類型:(
@ user1092483:那你能改變什么?
等等,我明白了嗎?您有一個循環,要求輸入一個數字,如果數字不是-10,會執行某些操作,否則會中斷?
如果是這樣,請查看以下內容:
while(true) {
number=Integer.parseInt( JOptionPane.showInputDialog("bla bla" ) );
if(number == -10) {
break;
}
themethod(number);
}
否則,如果不是這種情況,并且您想在兩種情況(-10號情況和方法為錯誤的情況)下進行折斷,則可以執行以下操作:
更改您的方法以返回布爾值。如果它是真的,那么它就不想破壞。如果它為假,則它想中斷,然后執行以下操作:
while(true) {
number=Integer.parseInt( JOptionPane.showInputDialog("bla bla" ) );
if(number == -10) {
break;
}
if(!themethod(number)) break;
}
如果您確實無法編輯循環,則只需從方法中拋出異常即可!但是,這將退出整個程序。但是,我看不到任何其他可能的方式。
等等,為什么您不能編輯課程?您可以編輯循環條件嗎?
嗯...然后只是調用一個異常。你在課堂上做什么。也許知道這會給我們一個提示,告訴他們他們期望您做什么。
我們有關于例外的討論,但是當我嘗試添加例外時,它仍然無法正常工作。問題是,當我輸入一個負數時,該方法之后的方法仍然會執行,并且如果我輸入一個負數,它們將失敗。
也許您可以發布所有代碼。我感覺這里還有更多我們看不到的東西。" bla"可以抓住答案的關鍵。
沒有themethod(int)的返回值并且沒有更改其他類的代碼,這是不可能的,因為就這樣,沒有返回通信。您必須同時更改兩者。如果不更改循環中的邏輯就無法做到這一點。
這樣就無法從while循環中進行受控中斷。你只能做System.exit(0);這會中斷整個程序或引發異常,并希望循環能夠處理它。也許發布您的完整代碼?另外,請在您的問題中添加"作業"標簽。