Java:关于跳出两层循环的方法以及Label(标签)
- HR曾问过我这样一个问题:Java中,如何跳出两层循环?
- 虽然当时没有说我的答案是错的,但也没完全认可。以下为对该问题的重新研究。
1. Label(标签)
- 标签只能存在于 循环语句 中,且只能在循环的头部位置。
- 标签的唯一作用:当 break 和 continue 配合标签使用后可以更好地控制循环的跳转以及中断。
- 标签的形式(位置):
label:while (condition) {}
label:
for (condition){}
- 在给出示例之前需要明确 break、 continue 以及 return 的意思。
- break:终止当前循环,并跳出当前循环。
- continue:终止当前循环的一条语句,并跳转至下一条语句。
- return:结束当前方法。
示例一:(啥也没有)
package com.oop.demo01;
public class Loop {
public static void main(String[] args) {
test1();
}
private static void test1() {
outerLoop:
for (int i = 0; i < 3; i++){
innerLoop:
for (int j = 0; j < 3; j++){
if (j==1){
//啥也没有
}
System.out.print("i"+i+" j"+j+", ");//内循环结果出现在一行
}
System.out.println();//内循环结束后换行
}
}
}
结果一:(啥也没有)
示例二:(continue)
package com.oop.demo01;
public class Loop {
public static void main(String[] args) {
test2();
}
private static void test2() {
outerLoop:
for (int i = 0; i < 3; i++){
innerLoop:
for (int j = 0; j < 3; j++){
if (j==1){
continue;//当j==1时,终止当前循环的这一条语句,跳转至下一条,即j==2时的语句。
}
System.out.print("i"+i+" j"+j+", ");//内循环结果出现在一行
}
System.out.println();//内循环结束后换行
}
}
}
结果二:(continue)
示例三:(break)
package com.oop.demo01;
public class Loop {
public static void main(String[] args) {
test3();
}
private static void test3() {
outerLoop:
for (int i = 0; i < 3; i++){
innerLoop:
for (int j = 0; j < 3; j++){
if (j==1){
break;//当j==1时,终止当前循环,并跳出当前循环。回到了上一级循环从i==1开始。
}
System.out.print("i"+i+" j"+j+", ");//内循环结果出现在一行
}
System.out.println();//内循环结束后换行
}
}
}
结果三:(break)
示例四:(continue outerLoop)
package com.oop.demo01;
public class Loop {
public static void main(String[] args) {
test4();
}
private static void test4() {
outerLoop:
for (int i = 0; i < 3; i++){
innerLoop:
for (int j = 0; j < 3; j++){
if (j==1){
continue outerLoop;//当j==1时,终止当前循环的这一条语句,跳转至外循环,并终止当前外循环的这一条语句(导致没有输出“换行”),从i==1开始。
//得到的数据与break相同,唯一的区别是没有输出换行,导致格式不同,结果都在同一行。
}
System.out.print("i"+i+" j"+j+", ");//内循环结果出现在一行
}
System.out.println();//内循环结束后换行
}
}
}
结果四:(continue outerLoop)
示例五:(continue innerLoop)
package com.oop.demo01;
public class Loop {
public static void main(String[] args) {
test5();
}
private static void test5() {
outerLoop:
for (int i = 0; i < 3; i++){
innerLoop:
for (int j = 0; j < 3; j++){
if (j==1){
continue innerLoop;//当j==1时,终止当前循环的这一条语句,跳转至内循环,并终止当前内循环的这一条语句(重复操作),从j==2开始。
//得到的结果与continue完全相同
}
System.out.print("i"+i+" j"+j+", ");//内循环结果出现在一行
}
System.out.println();//内循环结束后换行
}
}
}
结果五:(continue innerLoop)
示例六:(break outerLoop)
package com.oop.demo01;
public class Loop {
public static void main(String[] args) {
test6();
}
private static void test6() {
outerLoop:
for (int i = 0; i < 3; i++){
innerLoop:
for (int j = 0; j < 3; j++){
if (j==1){
break outerLoop;//当j==1时,终止当前循环,跳转至外循环,并终止当前外循环。
//该结果表明:已经跳出了两层循环。
}
System.out.print("i"+i+" j"+j+", ");//内循环结果出现在一行
}
System.out.println();//内循环结束后换行
}
}
}
结果六:(break outerLoop)
示例七:(break innerLoop)
package com.oop.demo01;
public class Loop {
public static void main(String[] args) {
test7();
}
private static void test7() {
outerLoop:
for (int i = 0; i < 3; i++){
innerLoop:
for (int j = 0; j < 3; j++){
if (j==1){
break innerLoop;//当j==1时,终止当前循环,跳转至内循环,并终止当前内循环(重复操作)。
//得到的结果与break完全相同。
}
System.out.print("i"+i+" j"+j+", ");//内循环结果出现在一行
}
System.out.println();//内循环结束后换行
}
}
}
结果七:(break innerLoop)
示例八:(return)
package com.oop.demo01;
public class Loop {
public static void main(String[] args) {
test8();
}
private static void test8() {
outerLoop:
for (int i = 0; i < 3; i++){
innerLoop:
for (int j = 0; j < 3; j++){
if (j==1){
return;//结束当前方法。
//得到的结果与break outerLoop完全相同(已通过其他测试验证了不存在格式不同问题)。该结果表明:已经跳出了两层循环。
}
System.out.print("i"+i+" j"+j+", ");//内循环结果出现在一行
}
System.out.println();//内循环结束后换行
}
}
}
结果八:(return)
结论:
-
一共有八种类型如下:
- 啥也没有 → 完全输出
- continue → 终止当前循环的一条语句,并跳转至下一条语句。
- break → 终止当前循环,并跳出当前循环。
- continue outerLoop → 看似与break几乎相同,但会跳过与内循环平行的其他语句,例如示例中的换行语句
System.out.println();//内循环结束后换行
。 - continue innerLoop → 与continue完全相同。
- break outerLoop → 终止当前循环,还能终止外层循环。
- break innerLoop → 与break完全相同。
- return → 结束当前方法。看似与break outerLoop完全相同,但会跳过与外循环平行的其他语句,示例中是由于没有平行语句才并未体现。
2. 如何跳出两层循环的答案
- break outerLoop:
- 给外循环加上 outerLoop: 的标签,在想要跳出的位置写上
break outerLoop;
- 给外循环加上 outerLoop: 的标签,在想要跳出的位置写上
- return:
- 由于是直接结束了整个方法,自然也就跳出了该方法下所有的循环。
- 2022年05月10日新增(瞎想):
- 自然退出(?):
- 等待所有循环结束,自然就退出了所有的循环。
- 2022年07月01日新增(tip):
- 由于用了 return 会跳过与循环语句平行的其他未执行语句,为了避免这种情况,可以将两层循环单独抽离成一个方法,在其他方法中进行调用即可。
PS: 在C/C++语言中,有一种goto语法,与break outerLoop语法相似。
示例:
#include<stdio.h>
int n=0;
int main(void) {
printf("input a string: ");
loop: if (getchar()!='\n') {
n++;
goto loop;
}
printf("output: %d\n",n);
}
- 在C/C++语言中,goto语句常被用于跳出多层循环。但goto语句的使用往往会使程序的可读性降低,所以Java不允许goto跳转。在Java中,goto也是作为关键字被保留的,但这个关键字没有任何作用,只是为了将来可能的扩展,防止使用goto作为程序中的标识符。