在java的控制执行流程中,条件控制分支包括if-else、while、do-while、for,而无条件分支控制包括return、break和continue。
下面简述无条件分支控制:
在java中有多个关键词表示无条件分支,它们只是表示这个分支无需任何测试即可发生。这些关键字包括return、break和continue和一种与其他语言中的goto类似的跳转到标号语句的方式。
return关键字有两个方面的用途:
①它指定一个方法返回什么值(假定它没有void返回值)。
②它会导致当前的方法退出,并返回那个值。
//以下是它的一个简单的测试:
public class IfElse {
static int test(int value, int target) {
if (value > target)
return 1;
else if (value < target)
return -1;
else
return 0;
}
public static void main(String[] args) {
System.out.println(test(10, 5));
System.out.println(test(5, 10));
System.out.println(test(5, 5));
}
}
如果在返回 void 的方法中没有 return 语句,那么在该方法的结尾处会有一个隐式的人 retrun ,因此在方法中并非总是必须要有一个 return 语句。但是,如果一个方法声明它将返回 void 之外的其它东西,那么必须确保每一条代码路径都将返回一个值。
在任何迭代语句的主体部分,都可以用 break 和 continue 控制循环的流程。其中,break 用于强行退出循环,不执行循环中剩余的语句。而 continue 则停止执行当前的迭代,然后退回循环的起始处,开始下一次迭代。
//以下是它的一个简单测试
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
if (i == 74) break;
if (i % 9 != 0) continue;
System.out.print(i + " ");
}
}
/*输出:
0 9 18 27 36 45 54 63 72
循环从0开始,0不符合两个 if 布尔判断,于是直接打印值。递增之后到1,1符合第二个布尔值判断,执行 continue 语句,它跳过 continue 之后的内容,进入下一轮循环,即进入递增到2的循环,所以,i的值为1的情况不进行打印输出。余下情况以此类推,当 i 的值增长到74时,执行 break 语句,该循环终止,执行方法中循环体以下的其它代码,如打开以上被注释的代码则它将会被执行。
在这个循环中,i 的值永远都不会达到100,因为一旦 i 到达74,break 语句就会中断循环。
continue 语句执行序列移回到循环的开头,而没有去完成 continue 语句之后的所有内容。
带 goto 跳转功能的控制
由于 goto 语句是在源码级上的跳转,一个程序总是从一个地方跳到另一个地方,还有什么办法能识别程序的控制流程呢?
java 没有 goto,但是java也能完成一些类似于一些跳转的操作,这与 break 和 continue 这两个关键字有关。
标签:标签是后面跟有冒号的标识符,就像这样:label2
在java中,标签起作用的唯一地方刚好是在迭代语句之前。
label1:
outer-iteration {
inner-iteration {
//...
break; //①
//...
continue; //②
//...
continue label1; //③
//...
break label1; //④
}
}
在①中,break 中断内部迭代,回到外部迭代。
在②中,continue 使执行点移回内部迭代的起始处。
在③中,continue label1 同时中断内部迭代以及外部迭代,直接转到 label1 处;随后,它实际上继续迭代过程,但却从外部迭代开始。
在④中,break label1 也会中断所有迭代,并回到 label1 处,但并不重新进入迭代。也就是说,它实际上是完全终止了两个迭代。
代码实例:
public static void main(String[] args) {
int i = 0;
outer:
for(;true;){
inner:
for(;i<10;i++){
System.out.println("i=" + i);
if(i == 2){
System.out.println("continue");
continue;
}
if(i == 3){
System.out.println("break");
i++;
break;
}
if(i == 7){
System.out.println("continue outer");
i++;
continue outer;
}
if(i == 8){
System.out.println("break outer");
break outer;
}
for(int k = 0; k < 5; k++){
if(k == 3){
System.out.println("continue inner");
continue inner;
}
}
}
}
}
/*运行结果:
i=0
continue inner
i=1
continue inner
i=2
continue
i=3
break
i=4
continue inner
i=5
continue inner
i=6
continue inner
i=7
continue outer
i=8
break outer
注意,break 会中断for循环,而且在抵达for循环的末尾之前,递增表达式不会执行。由于break跳过了递增表达式,所以在i == 3 的情况下直接对i执行递增运算。在 i==7的情况下,continue outer 语句会跳到循环顶部,而且也会跳过递增,所以这里也对i直接递增。
如果没有break outer 语句,就没有办法从内部循环里跳出外部循环。这是由于break本身只能中断最内层的循环(continue同样也是如此)。
总结:
1)一般的continue会退回最内层循环的开头(顶部),并继续执行。
2)带标签的continue会到达标签的位置,并重新进入紧接在那个标签后面的循环。
3)一般的break会中断并跳出当前循环。
4)带标签的break会中断并跳出标签所指的循环。
重点是:在java里需要使用标签的唯一理由就是因为有循环嵌套存在,而且想从多层嵌套中break或continue。
////end