有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java:从被调用的方法中“断开”循环?

我的小程序有点问题。 我有一个JOptionPane请求一个数字,如果这个数字小于10,那么一个循环将继续不断地做其中的事情,不断地请求数字。在该循环中,我调用一个方法,参数为int。在该方法中,我需要(不改变调用该方法的类中的任何代码)找出我输入的数字是否小于1。如果是,我需要调用另一个方法。那一点已经完成了

但是!主循环一直在滚动,因此它一直在做循环中的其他事情。我需要阻止它这样做,因此在方法中的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) 个答案

  1. # 1 楼答案

    等等,我说得对吗?有一个循环要求输入一个数字,如果数字不是-10,则执行某些操作,否则会中断

    如果是,请看以下内容:

    while(true) {
        number=Integer.parseInt( JOptionPane.showInputDialog( "bla bla" ) );
        if(number == -10) {
            break;
        }
        themethod(number);
    }
    

    否则,如果情况并非如此,并且您希望分为两种情况,即-10情况和方法为false情况,则可以执行以下操作:

    更改方法以返回布尔值。如果这是真的,那么它就不想破裂。如果它是假的,那么它想要破坏,然后执行以下操作:

    while(true) {
        number=Integer.parseInt( JOptionPane.showInputDialog( "bla bla" ) );
        if(number == -10) {
            break;
        }
        if(!themethod(number)) break;
    }
    

    如果确实无法编辑循环,则只需从方法中抛出异常!但这将退出您的整个程序。但是,我看不到任何其他可能的方法

  2. # 2 楼答案

    在这里你可以做很多事情。最终,您要做什么应该取决于您的编码风格和您要完成的任务

    选项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中做过很多工作了,因此我可能不会在这里编写最习惯的代码。:-)

  3. # 3 楼答案

    添加一个返回值,指示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");
       }
    }
    
  4. # 4 楼答案

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