1

我有这段代码,它在特定条件下(当 x 和 y 都等于零时)从数组生成随机数。我希望控件跳转到标签。但是控件在任何情况下都不会跳转到标签。我想知道我做的对不对?

int[] arr = {0, 1, 2};    
Random rn = new Random();
label: {
    //some code
    if (x != 0 && y !=0) {
        //some code
    } else {
        break label;
    }
}
4

5 回答 5

10

无需检查是否应该,if的,您可以在 Java中使用带标签的语句。根据1.7规范

标识符被声明为立即包含的语句的标签。[...] 标识符语句标签与出现在标记语句中的任何位置的break (§14.15) 或continue (§14.16) 语句一起使用。

它继续(强调添加)

如果语句由标识符标记,并且包含的​​语句由于与相同标识符的中断而突然完成,则标记语句正常完成。在语句突然完成的所有其他情况下,带标签的语句出于相同的原因突然完成。

所以如果你break是一个if块(记住一个块是一个语句),你可以退出if主体。让我们测试一下:

public static void main(String[] args) {
    if (true) label: {
        if (args != null)
            break label;
        System.out.println("doesn't get here");
    }
    System.out.println("Outside of labeled block");
}

输出:

Outside of labeled block
于 2017-09-13T10:27:34.623 回答
3

break语句会中断循环并且不会将控制权转移给标签。

break当您有内部和外部循环时,使用带有 is 的标签。未标记break的会破坏最内层的循环(您所在的循环),而标记的则break允许您指定外部循环。

请参阅:http ://docs.oracle.com/javase/tutorial/java/nutsandbolts/branch.html

特别是BreakWithLabelDemo

于 2013-02-12T15:27:28.310 回答
2

尽量避免使用标签。你可以在那里做的是:

while(true) {
    if(x == 0 && y == 0) {
        break;
    }
    // some stuff with x and y
}
于 2013-02-12T15:28:35.753 回答
1

我建议你使用递归函数。

public void work(){
    // some code
    if (x != 0 && y != 0) {
        //some code
    } else {
        work();
    }
} 

break没有循环就不能使用

于 2013-02-12T15:39:40.770 回答
-1

据我所知,标签不能在 周围任意使用{},您需要使用它们来标记 for、while 或 do-while 循环

于 2013-02-12T15:27:19.293 回答