一、break
在Java 中,break语句有3种作用。
-
第一,在switch语句中,它被用来终止一个语句序列。
在switch语句中,break用来终止一个语句序列,其实根据第二条,switch本身就是一个循环体,所以break在switch中作用也是强制退出一层循环,退出一个循环体。
-
第二,它能被用来强制退出一个循环体,在多个循环嵌套中,break只退出当前所在的一层循环体。
首先确定一下嵌套循环中的一层循环的概念,如下为3层循环,
每一层中的break语句强制退出当前所在的循环层!
for(;;){
//第一层循环
if( 1 < 2){ break;}
for(;;){ //第二层循环
if( 2 < 3){ break;}
for(;;){ //第三层循环
if( 3 < 4){ break;}
}
}
}
if( 1 < 2){ break;}
for(;;){ //第二层循环
if( 2 < 3){ break;}
for(;;){ //第三层循环
if( 3 < 4){ break;}
}
}
}
-
第三,它能作为一种“先进”goto 语句来使用,带标签的break。
这种情况下的break跟goto的关系是:吸收goto语句的精华,舍弃goto语句的糟粕,首先break功能使得程序退出当前循环层,然后确认标签并返回到标签处。
- 标签格式为“label:”,比如带“:”;
- 被加标签代码块必须包围break 语句;
- 被加标签的代码块可以是任何代码块(保证有break语句即可),即break不止可以退出循环;
boolean t
= true;
first : {
second : {
third : {
System.out.println( "Before the break.");
if(t) break second; // break out of second block
System.out.println( "This won't execute");
}
System.out.println( "This won't execute");
}
System.out.println( "This is after second block.");
}
first : {
second : {
third : {
System.out.println( "Before the break.");
if(t) break second; // break out of second block
System.out.println( "This won't execute");
}
System.out.println( "This won't execute");
}
System.out.println( "This is after second block.");
}
运行该程序,产生如下输出:
Before the
break. This is after second block.
二、continue
- continue——作用是忽略continue后面剩余循环体语句,然后继续执行本层循环的条件表达式,执行下一次循环;
- 带标签continue——continue也有标签功能,类似break的功能,即 “continue + 标签 = break”;
//不带标签的continue
for( int i = 0; i < 10; i ++) {
System.out.print(i + " ");
if (i % 2 == 0)
continue;
System.out.println( "");
}
//带标签的continue
outer :
for ( int i = 0; i < 10; i ++) {
for( int j = 0; j < 10; j ++) {
if(j > i) {
System.out.println();
continue outer; //返回到标签处,退出
// break;
}
System.out.print( " " + (i * j));
}
}
for( int i = 0; i < 10; i ++) {
System.out.print(i + " ");
if (i % 2 == 0)
continue;
System.out.println( "");
}
//带标签的continue
outer :
for ( int i = 0; i < 10; i ++) {
for( int j = 0; j < 10; j ++) {
if(j > i) {
System.out.println();
continue outer; //返回到标签处,退出
// break;
}
System.out.print( " " + (i * j));
}
}
带标签的输出结果:
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
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 + 标签 = break”,把语句中“
continue outer; ”注释掉,换成“break”,输出结果如下:
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
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标签的作用是找到循环体入口,继续下一次循环!
三、return
- return明确地从一个方法返回,即返回到调用该方法入口。
测试1:
public
static
void main( String[] args )
{
App ap = new App();
ap.breakTest();
}
public void breakTest(){
//不带标签的continue
for( int i = 0; i < 10; i ++) {
System.out.print(i + " ");
if (i % 2 == 0)
continue;
System.out.println( "");
}
//带标签的continue
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));
}
}
}
{
App ap = new App();
ap.breakTest();
}
public void breakTest(){
//不带标签的continue
for( int i = 0; i < 10; i ++) {
System.out.print(i + " ");
if (i % 2 == 0)
continue;
System.out.println( "");
}
//带标签的continue
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));
}
}
}
输出结果:
0
1
2 3
4 5
6 7
8 9
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
2 3
4 5
6 7
8 9
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
测试2,更换continue outer; 为return:
public
static
void main( String[] args )
{
App ap = new App();
ap.breakTest();
}
public void breakTest(){
//不带标签的continue
for( int i = 0; i < 10; i ++) {
System.out.print(i + " ");
if (i % 2 == 0)
continue;
System.out.println( "");
}
//带标签的continue
outer :
for ( int i = 0; i < 10; i ++) {
for( int j = 0; j < 10; j ++) {
if(j > i) {
System.out.println();
// continue outer; //返回到标签处,退出
return;
}
System.out.print( " " + (i * j));
}
}
}
{
App ap = new App();
ap.breakTest();
}
public void breakTest(){
//不带标签的continue
for( int i = 0; i < 10; i ++) {
System.out.print(i + " ");
if (i % 2 == 0)
continue;
System.out.println( "");
}
//带标签的continue
outer :
for ( int i = 0; i < 10; i ++) {
for( int j = 0; j < 10; j ++) {
if(j > i) {
System.out.println();
// continue outer; //返回到标签处,退出
return;
}
System.out.print( " " + (i * j));
}
}
}
测试结果:
0
1
2 3
4 5
6 7
8 9
0
2 3
4 5
6 7
8 9
0
测试3,
更换第一个for循环中的continue为return:
public
static
void main( String[] args )
{
App ap = new App();
ap.breakTest();
}
public void breakTest(){
//不带标签的continue
for( int i = 0; i < 10; i ++) {
System.out.print(i + " ");
if (i % 2 == 0)
// continue;
return;
System.out.println( "");
}
//带标签的continue
outer :
for ( int i = 0; i < 10; i ++) {
for( int j = 0; j < 10; j ++) {
if(j > i) {
System.out.println();
// continue outer; //返回到标签处,退出
return;
}
System.out.print( " " + (i * j));
}
}
}
{
App ap = new App();
ap.breakTest();
}
public void breakTest(){
//不带标签的continue
for( int i = 0; i < 10; i ++) {
System.out.print(i + " ");
if (i % 2 == 0)
// continue;
return;
System.out.println( "");
}
//带标签的continue
outer :
for ( int i = 0; i < 10; i ++) {
for( int j = 0; j < 10; j ++) {
if(j > i) {
System.out.println();
// continue outer; //返回到标签处,退出
return;
}
System.out.print( " " + (i * j));
}
}
}
测试结果:
0
当遇到第一个return时,没有再继续往下运行,直接返回到了方法入口!