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
,其中的计时器位于另一个的循环中。
那么为什么我会收到错误?
答案 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有什么作用?因为我正在考虑不同的解决方案,但我必须知道它的行为。