Java:来自被调用方法的“Break”循环?

时间:2011-12-11 17:34:56

标签: java loops iteration break

我的小程序有点问题。 我有一个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
  }

4 个答案:

答案 0 :(得分:7)

你可以在这里做很多事情。最终你所做的应该取决于你的编码风格以及你想要完成的事情。

选项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 :(得分:2)

添加一个返回值,指示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");
   }
}

答案 2 :(得分:1)

等等,我也这样做了吗?你有一个循环,询问一个数字,如果数字不是-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;
}

如果你真的无法编辑循环,那么只需从方法中抛出一个异常!但是,这将退出整个程序。但是,我没有看到任何其他可能的方法。

答案 3 :(得分:0)

没有themethod(int)的返回值且不更改其他类的代码,这是不可能的,因为它本身没有返回通信。你必须改变两者;如果不改变循环中的逻辑,就无法完成。