说明:goto
在一些编程语言(如C语言)中,是用来表示跳转的,即代码执行到此处跳转到对应位置继续执行。
举例
举个例子,如下,是一个双层嵌套循环。现在我需要代码在内层循环符合某条件时跳出双层循环,即跳出整个双层循环。
public static void main(String[] args) {
int[][] array = new int[10][10];
// 放入一个特殊值,作key
array[7][7] = 1000;
// 依序赋值
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
if (array[i][j] == 0) {
array[i][j] = i * array.length + j + 1;
}
}
}
// 寻找特殊值
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
if (array[i][j] == 1000) {
System.out.println("got it!");
break;
}
System.out.print(array[i][j] + " ");
}
System.out.println();
}
}
执行,可以看到,break
只能跳出内循环,外循环没有跳过。但按照代码描述,找出特殊值后,代码没有继续执行下去的必要。
解决
上面这种场景博主在项目中遇到过,可以有两种解决思路。第一种就是引入变量,设置一个开关,内循环符合条件后,修改开关,外循环判断,如下:
public static void main(String[] args) {
int[][] array = new int[10][10];
// 放入一个特殊值,作key
array[7][7] = 1000;
// 依序赋值
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
if (array[i][j] == 0) {
array[i][j] = i * array.length + j + 1;
}
}
}
// 定义一个开关
boolean flag = true;
// 寻找特殊值
for (int i = 0; i < array.length; i++) {
if (flag) {
for (int j = 0; j < array[i].length; j++) {
if (array[i][j] == 1000) {
System.out.println("got it!");
// 符合条件,设置开关
flag = false;
break;
}
System.out.print(array[i][j] + " ");
}
}
System.out.println();
}
}
执行如下,能达到目的
第二种方式,就是使用类似 goto
的方式,可定义代码 break
跳出到某处,如下:
public static void main(String[] args) {
int[][] array = new int[10][10];
// 放入一个特殊值,作key
array[7][7] = 1000;
// 依序赋值
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
if (array[i][j] == 0) {
array[i][j] = i * array.length + j + 1;
}
}
}
// 寻找特殊值
// 打一个标签
out:
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
if (array[i][j] == 1000) {
System.out.println("got it!");
// 跳出到out标签
break out;
}
System.out.print(array[i][j] + " ");
}
System.out.println();
}
}
效果一样,但显然上面这种更优雅(zhuang b)一点
另外
在Java语言中,禁止C语言那种随意跳转代码执行的语法规则,但仍保留了 goto
关键字(没有特殊用法),同时支持上面这种可跳出多层循环(不仅双层循环)的语法。如果你的代码中有上述跳出多层嵌套循环的逻辑,这不失为一种选择。
个人认为Java把 goto
砍掉是对的,随意跳转代码执行提高了程序员阅读代码的难度,因为它破坏了代码 从上到下,顺序执行 的逻辑。