中断不能用于循环

时间:2015-11-10 11:42:46

标签: java break

for(int i = 0; i < 10; ++i) {
  outerTimer = new Timer() {
    @Override
    public void run() {        
      if(stopTimer) {
        cancel();
        break; // break cannot be used outside of a loop or a switch
      }

     repeatLoop();
    }         
  };

  outerTimer.run();
  outerTimer.scheduleRepeating(tmptimerDuration);
}

在上面的代码中,当stoptimer为true但是抛出错误时,我使用break来打破循环

break cannot be used outside of a loop or a switch 

但我在计时器里面使用了break ,其中的计时器位于另一个的循环中。

那么为什么我会收到错误?

3 个答案:

答案 0 :(得分:3)

匿名类在编译时成为单独的类。以下代码大致相当:

class ContainingClass {
  void myMethod() {
    for(int i = 0; i < 10; ++i) {
      outerTimer = new MyAnonymousTimer();

      outerTimer.run();
      outerTimer.scheduleRepeating(tmptimerDuration);
    }
  }
}

class MyAnonymousTimer extends Timer {
  @Override
  public void run() {        
    if(stopTimer) {
      cancel();
      break; // break cannot be used outside of a loop or a switch
    }

   repeatLoop();
  }         
}

(名称MyAnonymousTimer不是该类的实际名称;它更像ContainingClass$1

因此,break并非真正在循环中;你可以通过循环声明它只是语法上的便利。

您需要使用return,就像停止执行任何其他void方法一样。

答案 1 :(得分:1)

您可以拥有final boolean变量(可以从该函数访问 ),并在应该中断时将其值设置为true。然后,在for循环中,您只需检查变量true是否中断。

您的代码不起作用,因为break实际上不在for循环内,它位于另一个范围内的匿名函数内。

答案 2 :(得分:0)

你会看到“break”以图形方式位于循环内部,但“break”确实位于不同的范围内。 这样,break指令在内部作用域内执行(并注意每次迭代都有一个新指令)。

repeatLoop有什么作用?因为我正在考虑不同的解决方案,但我必须知道它的行为。