# Java 中的标签语句

> 原文： [https://howtodoinjava.com/java/basics/labeled-statements-in-java/](https://howtodoinjava.com/java/basics/labeled-statements-in-java/)

Java [标签块](https://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.15)在逻辑上类似于 C/C++ 中的`goto`语句。

> 标签是任何有效的 Java 标识符，后跟冒号。 例如`external:`，`inner:`，`inner123:`，`inner_:`等

## 1\. `String`类中的标签语句

多少次我们被告知`goto`语句是邪恶的。 我本人已经通过我们这个时代许多受人尊敬的作者读到了这种所谓的邪恶。 但是，如果您查看[`String.java`](http://www.docjar.com/html/api/java/lang/String.java.html)的源代码，并阅`public String toLowerCase(Locale locale)`方法的源代码，则您将遇到类似这样的情况 ：

```java
scan :
    for (firstUpper = 0 ; firstUpper &lt; count; ) 
    {
        char c = value[offset+firstUpper];
        if ((c >= Character.MIN_HIGH_SURROGATE) &amp;&amp;
            (c <= Character.MAX_HIGH_SURROGATE)) {
            int supplChar = codePointAt(firstUpper);
            if (supplChar != Character.toLowerCase(supplChar)) {
                break scan;
            }
            firstUpper += Character.charCount(supplChar);
        } else {
            if (c != Character.toLowerCase(c)) {
                break scan;
            }
            firstUpper++;
        }
    }
    return this;
}

```

这是`scan:`。 这是我们今天将要学习的标签块。 好吧，他们总是告诉我们不要使用它们，并在 JDK 分发中最常用的类中使用了它们。

## 2\. 带有`break`和`continue`关键字的标签语句

在 Java 中，我们都知道关键字`break`和`continue`的存在目的。 基本上，语句`break`和`continue`会更改复合语句的常规控制流。

#### 2.1 带有和不带有标签语句的`break`关键字

```java
while (Some condition) 
{
  if ( a specific condition ) 
  		break;        //Default usage
  else
  		normal business goes here..
}

```

另一种方法是将`break`与标签语句一起使用。

```java
hackit:
while (Some condition) 
{
  if ( a specific condition ) 
  		break hackit;       //Usage with label
  else
  		normal business goes here..
}

```

每当在程序执行过程中，遇到带标签的`break`语句，该控制都会立即退出封闭的带标签的块。

同样，带标签的`continue`将使控制重新开始。 就像在普通的`break`和`continue`语句中一样，为块赋予了其他名称。

#### 2.2 更多例子

让我们来看更多示例用法：

```java
outer: for (int i = 0; i &lt; 10; i++) {
  inner: for (int j = 10; j > 0; j--) {
    if (i != j) {
      System.out.println(i);
      break outer;
    }else{
      System.out.println("-->>" + i);
      continue inner;
    }
  }
}

```

或者

```java
int a = 10;
int b = 12;

block1: {
    if (a &lt; 0) {
      break block1;
    }
    if (b &lt; 0) {
      break block1;
    }
    System.out.println( a + b );
  }
}

```

## 3\. 总结

*   Java 没有通用的`goto`语句。
*   Java 中的`break`和`continue`语句更改了复合语句的常规控制流。 他们可以使用带有冒号的有效的 Java 标识符作为标签。
*   带标签的块只能与`break`和`continue`语句一起使用。
*   必须在其范围内调用它们。 您不能引用它们标签的块的范围。
*   `break`语句立即跳到相应复合语句的末尾（或跳出）。
*   `Continue`语句立即跳转到相应循环的下一个迭代（如果有）。
*   `Continue`语句不适用于`switch`语句或块语句，仅适用于循环的`for`，`while`和`do-while`循环的复合语句。

学习愉快！