我的小程序有点问题。
我有一个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);这会中断整个程序或引发异常,并希望循环能够处理它。也许发布您的完整代码?另外,请在您的问题中添加"作业"标签。