2014-10-12 58 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以上時,它從外部循環中突破。希望這可以幫助。