A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 黄兴旺 于 2013-8-24 19:28 编辑

class  Demo
{
        public static void main(String[] args)
        {
                w:for (int x=0;x<4 ;x++ )
                {
                        q:for (int y=0;y<5 ;y++ )
                        {
                        System.out.println(x);
                                  //break w;
                        }
                        break;//  这两个break的结果为什么不一样,不是都是结束外循环吗?
                }
               
        }
}

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

17 个回复

倒序浏览
你这里既然用到了标签,那么要在内循环结束外循环就该这么写:
class  Demo
{
        public static void main(String[] args)
        {
                w:{//要跳转的地方用标签括起来
                for (int x=0;x<4 ;x++ )
                {
                        q:for (int y=0;y<5 ;y++ )
                        {
                        System.out.println(x);
                                  break w;
                        }
                        //break;//  这两个break的结果为什么不一样,不是都是结束外循环吗?
                }
                }
               
        }
}

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

回复 使用道具 举报
java的break语句的用途是从一个封闭的语句,如switch开关语句或循环中跳出:

                                               break label;

其中label是用于指定一个封闭语句的标号,一般加标号形式:

breakToHere:some javastatement。

其中的标号必须是合法的java标志。

break语句的标号是可选的,当break语句不带标号时,其作用与c语言中一样;

1).在switch语句中终止某个case;

2).迫使一个循环立即结束,绕过正常的循环条件检测(但在此时只能跳出最内层封闭的语句)

break 语句中的标号指示包含本break语句的任一个封闭的语句。这意味着带标号的break语句不仅仅可以跳

出方法内任何指定的语句 或循环。

test: if (check (i) {

                  for (int j=0 ;j<=10 ;j++){

                       if (j>i)break;    //仅仅终止该循环

                       if(a[i][j]=null)//关于null:http://baike.baidu.com/view/329484.html

                                        break test;

                                              }

                                 ……

                                 }

注:其中break标号指整个if语句,在这个if语句中包含了for循环,for循环的第一个break语句无标号

因此在j>i条件成立时它仅仅终止for循环,此时将继续执行if语句的for循环后面的语句;而第二个break

语句带有标号test,当a[i][j]=null时将沪综指整个if语句,程序将转到if后面的语句开始执行。

在java中带标号的break语句可以与finally子句配合使用:

test:if(check(i){

                            try   {

                                for(int j=0;j<10;j++){

                                       if (j>i)break;

                                       if(a[i][j]=null)

                                          break test;

                                      }

                                   }

                                  finally {cleanup(a,i,j);}

            }

注:若a[i][j]=null条件成立,将执行第二条break语句,由于break指向外层的if封闭语句,在该语句执行finally子句,在finally子句的cleanup执行终止if语句。

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

回复 使用道具 举报
希望你能有所新的了解和认识……
回复 使用道具 举报
我觉得是break w强制结束了两个循环,外面的break要等q循环循环一次以后才执行,所以结果不一样。
回复 使用道具 举报
xuluheng718 发表于 2013-8-24 14:43
你这里既然用到了标签,那么要在内循环结束外循环就该这么写:
class  Demo
{

还是不一样啊,在内循环内break w;和在外循环break w;结果不一样,为什么在内循环break w;的时候内循环也只执行了一次
回复 使用道具 举报
冯安宇 发表于 2013-8-24 14:48
我觉得是break w强制结束了两个循环,外面的break要等q循环循环一次以后才执行,所以结果不一样。 ...

结果是这样的,break w;在外边,可以打印内循环循环次数个0,在里边就只能打印一个0
回复 使用道具 举报
joechen 发表于 2013-8-24 14:56
还是不一样啊,在内循环内break w;和在外循环break w;结果不一样,为什么在内循环break w;的时候内循环也 ...

那是因为你内循环在循环一次时候就break了,你看看你的内循环代码:
                       q:for (int y=0;y<5 ;y++ )
                        {
                                   System.out.println(x);//一次循环就break了
                                   break w;
                        }
回复 使用道具 举报
这位大哥说的极是……还得多多揣摩哦!
回复 使用道具 举报
xinchenglong 发表于 2013-8-24 15:24
这位大哥说的极是……还得多多揣摩哦!

哈哈,好好揣摩
回复 使用道具 举报
xuluheng718 发表于 2013-8-24 15:00
那是因为你内循环在循环一次时候就break了,你看看你的内循环代码:
                       q:for (int  ...

是不是break w;在内循环里边内外循环都结束?

回复 使用道具 举报
是的,你可以试试
回复 使用道具 举报
joechen 发表于 2013-8-24 16:22
是不是break w;在内循环里边内外循环都结束?

break的作用就是跳出当前的语句块,而语句块就是被大括号括起来的语块,在嵌套循环中,假如break在内循环,那么当break的条件满足后就跳出内循环,但是不会跳出外循环,关键是你这里使用了标签,而标签和break配合的的作用就是跳转到当前的标签下,break w定义在内循环,你的w标签定义在外循环,那么当内训换遇到break w时候就跳转到w标签外了。
回复 使用道具 举报
xuluheng718 发表于 2013-8-24 16:59
break的作用就是跳出当前的语句块,而语句块就是被大括号括起来的语块,在嵌套循环中,假如break在内循环 ...

好的,谢谢,有点小懂了
回复 使用道具 举报
我刚才走了一遍你的代码,注释掉内循环的break w后,q这个循环一直满足条件所以打印了5次0,当第六次不满足条件时才读到下一句就break了,因为你的第二个break在w循环语句中,所以还没等到x自增到2就挂掉了,同理,注释掉外循环中的break后,系统读完输出打印语句后,读到break w直接就把外循环挂掉了,所以整个循环就停止了,所以只打印了一个0

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
楞个里格朗 发表于 2013-8-24 18:12
我刚才走了一遍你的代码,注释掉内循环的break w后,q这个循环一直满足条件所以打印了5次0,当第六次不满足 ...

恩恩记住就是了
回复 使用道具 举报
本帖最后由 王广亚 于 2013-8-24 19:35 编辑
  1. package exception;

  2. public class PackageDemo {
  3.      public static void main(String[] args)
  4.      {
  5.          w:for (int x=0;x<4 ;x++ )
  6.             {
  7.                 q:for (int y=0;y<5 ;y++ )
  8.                 {
  9.                    System.out.println(x);
  10.                     break w;        //这个break是当执行到此处是跳转到标签w出(此处就是外for循环)
  11.                                               //因为这个内循环y是从0开始的,所以此处的内循环没用
  12.                                                //System.out.println(x);break;代替。
  13.                                  }
  14.                              //    break;//  而这个break是当内循环循环完再跳转。
  15.                         }
  16.                         
  17.                  }
  18.          }
  19. /*
  20. * 当break;在内循环里时可以用简化为一下
  21. * public class PackageDemo {
  22. *          public static void main(String[] args)
  23.              {
  24. *                         for (int x=0;x<4 ;x++ )
  25.                 {
  26.                    System.out.println(x);
  27.                    break;
  28.                 }
  29.              }
  30.         }
  31.         ---------------------------------------
  32.         当break;在外循环里时可以用简化为一下
  33.         public class PackageDemo {
  34.                  public static void main(String[] args)
  35.                  {
  36.                          for (int x=0;x<4 ;x++ )
  37.                          {
  38.                                  for (int y=0;y<5 ;y++ )
  39.                                  {
  40.                                  System.out.println(x);                                
  41.                                  }
  42.                                break;
  43.                         }                        
  44.                  }
  45.          }
  46. *
  47. *
  48. */*/
复制代码

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马