2014-10-12 61 views
1

JLS 14.15:Break语句突然或正常完成?

没有标签break语句试图控制转移到最内层 包围开关,同时,执行,或用于 的声明立即封闭方法或初始化程序;

我对这条规则有误解。例如,如果我们写代码:

public static void main(String[] args) // Immediately enclosing method 
{ 
    while(true){      // Innermost enclosing 'while' for the break at LINE 2? 
     break;       // **LINE 2** 
    } 
} 

JLS说,当我们在LINE 2我们试图控制权转移到最内层的while。做什么的?在LINE 2控制已经在那个时候的block-statement

+4

JLS的第一条语句是:“一个break语句将一个封闭语句的控件*转出*。” – 2014-10-12 13:36:11

+0

@NathanMerrill是的,它说。根据我引用的规则,JLS试图说的是什么? – 2014-10-12 13:39:15

+1

@ St.Antario它的含义是,如果你有2个嵌套循环,并且在最内层循环中有一个中断,控制权将被转移到外层循环中。如果你有5个嵌套循环,并且最内层循环(第5个循环)中有一个中断,那么控制权转移到第4个循环中。 – 2014-10-12 13:43:03

回答

1

你需要检查你引述整段(在大胆判决是由我为清晰起见高亮):

一个break语句没有标签试图控制转移到最里面的封闭开关,同时,做或立即封闭的方法或初始化程序的声明; 这条语句被称为中断目标,然后立即正常完成。

在你的榜样,控制是为了终止,并继续执行转移到while声明。

1

这意味着如果你有嵌套的while循环,那么它会从最内层的时间中断开。因此对于例如

//this is just a sample nonsensical code 
    int i = 0; 
    while (true) { 
     if (i > 100) { 
     break; 
     } 
     while (true) { 
     if (i < 20) { 
      System.out.println("Inner while " + i); 
      i++; 
     } else { 
      break; 
     } 
     } 
     System.out.println("Outer while " + i); 
     i ++; 
    } 

观察输出。所以当我小于20时,它打印出我内部循环的值,但很快,当它跳到20时,它从内部循环中断开,并返回到外部循环并从外部循环开始执行sysout(尽管它在内部进行,但条件不成立得到满足),并看到当我达到100以上时,它从外部循环中突破。希望这可以帮助。