Java 支持三个跳转运算符 - 使用运算符
Java中的运算符用作
除了用在switch语句和循环中之外,使用运算符
有时尽早开始循环的下一次迭代很有用。也就是说,您需要继续执行循环,但停止处理本次特定迭代的循环体中的其余代码。事实上,这是操作员
最后一个控制语句是
break
,continue
和return
。它们将控制权转移到程序的另一部分。让我们详细考虑每个运算符。
使用运算符break
Java中的运算符break
在三种情况下使用。首先,正如您已经看到的,它在语句分支处结束语句序列switch
。其次,它可以用来跳出循环。第三,它可以用作无条件跳转运算符的“文明”形式goto
。本节解释最后两种情况。用于break
退出循环 通过使用break
,您可以强制循环立即终止,绕过条件表达式和循环体中的任何剩余代码。当循环中遇到一条语句时break
,第二条语句结束,程序控制将转移到其后面的语句。简单的例子:
// Использование break для выхода из цикла.
public class BreakLoop {
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
if (i == 4) {
break; // завершить цикл, если i = 4
}
System.out.println("i: " + i);
}
System.out.println("Цикл завершен.");
}
}
该程序生成以下输出:
i: 0
i: 1
i: 2
i: 3
Цикл завершен.
尽管此处的循环for
设计为执行 0 到 99 次其语句,但该运算符break
会使其在 i 为 4 时提前终止。该运算符break
可与任何 Java 循环一起使用,包括故意无限循环。例如,下面是使用循环编码的先前程序while
。该程序的输出与其前身相同。
// Использование break для выхода из while-цикла.
public class BreakLoop2 {
public static void main(String[] args) {
int i = 0;
while (i < 100) {
if (i == 4) {
break; // закончить цикл, если i = 4
}
System.out.println("i: " + i);
i++;
}
System.out.println("Цикл завершен.");
}
}
当在一组嵌套循环中使用时,该语句break
将仅退出最内层循环。例如:
// Использование break во вложенных циклах.
public class BreakLoop3 {
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
System.out.print("Итерация " + i + ": ");
for (int j = 0; j < 10; j++) {
if (j == 4) {
break; // закончить цикл, если j = 4
}
System.out.print(j + " ");
}
System.out.println();
}
System.out.println("Цикл завершен.");
}
}
该程序生成以下输出:
Итерация 0: 0 1 2 3
Итерация 1: 0 1 2 3
Итерация 2: 0 1 2 3
Цикл завершен.
正如您所看到的,内部循环中的语句break
仅导致该循环终止。外环不受影响。让我们再发表两点评论break
。首先,循环中可能会出现多个语句break
。不过,要小心。它们太多往往会破坏你的代码。其次,break
终止 - 运算符的switch
,仅影响给定的switch
- 运算符(而不影响包含它的循环)。 评论: Break
没有被设计为正常的循环终止方式。这个目的是通过循环头条件表达式来实现的。仅当出现某些特殊情况时,才应使用该语句break
来中断循环。
用作break
表格goto
除了用在switch语句和循环中之外,break
它还可以单独用作goto
. Java 不包含运算符,goto
因为它以任意且非结构化的方式执行分支。大量使用 . 的代码goto
通常难以理解和维护。它还会覆盖一些编译器优化。然而,程序中有几个地方goto
控制流是有价值且合法的构造。例如,goto
当您打破一组深度嵌套的循环时,它可能很有用。为了处理这种情况,Java 定义了运算符的扩展形式break
。使用它,您可以退出一个或多个代码块。这些块不需要是循环或语句的一部分switch
。这可以是任何块。接下来,您可以准确地确定执行将在哪里继续,因为此形式break
与标记一起使用并提供了 的好处goto
,绕过了它的问题。带标签的语句break
具有以下一般形式:break label;
这label
是标识某些代码块的标签的名称。执行此形式时break
,控制权从指定的代码块(其标签在语句中指定break
)转移到该块后面的语句。标记的代码块必须包含此语句break
,但不要求这种包含是直接的(也就是说,break
它不能直接包含在具有自己标签的块中,而是包含在其中的嵌套块中,也可能被标记)。这意味着您可以使用标记运算符break
来逃离一组嵌套块。但是您不能使用break
不包含break
. 要命名块,请将标签放置在块的开头(左大括号之前)。标签是任何有效的 Java 标识符,后跟一个冒号。标记块后,其标签可以用作运算符的参数break
。这将导致执行从标记块的末尾继续。例如,以下程序包含三个嵌套块,每个块都有自己的标签。运算符break
向前移动,超出标有标签的块的末尾second
,跳过两个运算符println()
。
// Использование break How цивorзованной формы goto.
public class Break {
public static void main(String[] args) {
boolean t = true;
first:
{
second:
{
third:
{
System.out.println("Перед оператором break.");
if (t) {
break second; // выход из блока second
}
System.out.println("Данный оператор никогда не выполнится");
}
System.out.println("Данный оператор никогда не выполнится ");
}
System.out.println("Данный оператор размещен после блока second.");
}
}
}
运行该程序会生成以下输出:
Перед оператором break.
Данный оператор размещен после блока second.
标记运算符最常见的用途之一break
是转义嵌套循环。例如,在以下程序中,外循环仅执行一次:
// Использование break для выхода из вложенных циклов.
public class BreakLoop4 {
public static void main(String[] args) {
outer:
for (int i = 0; i < 3; i++) {
System.out.print("Итерация " + i + ": ");
for (int j = 0; j < 100; j++) {
if (j == 10) {
break outer; // выйти из обоих циклов
}
System.out.print(j + " ");
}
System.out.println("Эта строка никогда не будет выведена");
}
System.out.println("Цикл завершен.");
}
}
该程序生成以下输出:
Итерация 0: 0 1 2 3 4 5 6 7 8 9 Цикл завершен.
很容易看出,当内层循环在外层循环结束之前被中断时,两个循环都会结束。请记住,您无法执行break
- 跳转到任何未为封闭块定义的标签。例如,以下程序是无效的,无法编译:
// Эта программа содержит ошибку.
public class BreakErr {
public static void main(String[] args) {
one:
for (int i = 0; i < 3; i++) {
System.out.print("Итерация " + i + ": ");
}
for (int j = 0; j < 100; j++) {
if (j == 10) {
break one; //He верно!
}
System.out.print(j + " ");
}
}
}
由于标记为 1 的循环不包含语句break
,因此无法将控制转移到该块。
使用运算符continue
有时尽早开始循环的下一次迭代很有用。也就是说,您需要继续执行循环,但停止处理本次特定迭代的循环体中的其余代码。事实上,这是goto
从下一个主体操作到循环块末尾的过渡。该动作由操作员执行continue
。在循环中,while
anddo while
运算符continue
使控制直接转移到控制循环的条件表达式。在循环中,for
控制首先传递到语句的迭代部分for
,然后传递到条件表达式。对于所有三个循环,任何中间代码都会被绕过。continue
下面给出了一个用于在每行打印两个数字的 示例程序:
// Демонстрирует continue.
public class Continue {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.print(i + " ");
if (i % 2 == 0) {
continue;
}
System.out.println("");
}
}
}
此代码使用运算%
(模)来检查某些内容是否为i
偶数。如果是,则循环继续而不打印换行符。 程序输出:
0 1
2 3
4 5
6 7
8 9
与 , 运算符一样break
,continue
您可以定义一个标签来指示要继续哪个封闭循环。continue
用于打印从 0 到 9 的三角乘法表的 示例程序。
// Использование continue с меткой.
public class ContinueLabel {
public static void main(String[] args) {
outer:
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
if (j > i) {
System.out.println();
continue outer;
}
System.out.print(" " + (i * j));
}
}
System.out.println();
}
}
此示例中的语句continue
结束循环评估j
,并继续由 驱动的循环的下一次迭代i
。该程序的输出:
0
0 1
0 2 4
0 3 6 9
0 4 8 12 16
0 5 10 15 20 25
0 6 12 18 24 30 36
0 7 14 21 28 35 42 49
0 8 16 24 32 40 48 56 64
0 9 18 27 36 45 54 63 72 81
它很少有用continue
。原因之一是 Java 提供了一组丰富的循环语句,适合大多数应用程序。然而,对于那些需要提前终止迭代的特殊情况,该语句continue
提供了一种结构化的方式来完成此任务。
操作员return
最后一个控制语句是return
. 它用于显式从方法返回,即将程序控制权转移回调用程序。该运算符return
被归类为转移运算符。尽管其完整讨论必须等到讨论了方法之后,这里还是提供了一个简短的概述return
。该运算符return
可以用在方法中的任何位置,以跳回调用该方法的程序。该语句return
立即结束其所在方法的执行。下面的例子说明了这一点:
// Демонстрирует return.
public class Return {
public static void main(String[] args) {
boolean t = true;
System.out.println("Перед оператором return.");
if (t) {
return; // возврат в вызывающую программу
}
System.out.println("Этот оператор никогда не выполнится.");
}
}
这return
会在运行时返回到 Java 系统,因为是系统调用main()
. 该程序的输出:
Перед оператором return.
您可能会注意到最终语句println()
并未执行。在执行时,return
控制权被转移回调用程序。最后一点。在前面的程序中,if
(t) 运算符是必需的。如果没有它,Java 编译器将抛出“无法访问的代码”错误,因为它知道最后一条语句println()
永远不会被执行。为了防止此错误,使用 (t) 运算符if
;为了演示目的,它会欺骗编译器。 原始来源链接: 转换运算符
GO TO FULL VERSION