繁体   English   中英

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

[英]Java: “Break” loop from called method?

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

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

选项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做了很多以来已经有一段时间了,所以我可能不会在这里编写最惯用的代码。 :-)

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM