第四章 控制執行流程

控制執行流程
if-else
while、do-while和for
foreach語法
標簽
return
break 和continue
switch
if-else
所有條件語句都利用條件表達式的真或假來決定執行路徑,if-else是控制程基本的形式。其中的else是可選的,所以可按下述兩種形式來使用if:
if(Boolean-expression)
statement

if(Boolean-expression)
statement
else
statement
布爾表達式必須產生一個布爾結果,statement指用分號結尾的簡單語句,或復合語句——封閉在花括號內的一組簡單語句。

public class Test {

public static void main(String[] args) {
    int i = 1;
    if(i == 1) {
        System.out.println("i等于1");
    }else {
        System.out.println("i不等于1");
    }//輸出:i等于1
}

}

while、do-while和for
while、do- while和for用來控制循環,有時將它們劃分為迭代語句(iteration statement),句會重復執行,直到起控制作用的布爾表達式(Booleanexpression)得到“假”的結果為止。

while循環格式如下:
while(Boolean-expression)
statement
循環剛開始時,會計算一次布爾表達式的值;而在語句的下一次迭代開始前會再計算一次
public class Test {

public static void main(String[] args) {
    int i = 0;
    while(i < 10) {
        System.out.print(i);
        i++;
    }
}//輸出:0123456789

}

這段代碼的意思是“循環輸出i的值”

do-while循環格式如下:
do
statement
while(Boolean-expression);
while和do-while唯一的區別就是do-while中的語句至少會執行一次,即便表達式第一次就被計算為false。而在 while循環結構中,如果條件第一次就為false,那么其中的語句根本不會執行。
public class Test {

public static void main(String[] args) {
    int i = 0;
    do {
        System.out.print(i);
        i++;
    }while(i < 10);
}//輸出:0123456789

}

這段代碼的意思是“循環輸出i的值”

for循環
這可能是最經常使用的迭代形式,這種在第一次迭代之前要進行初始化。隨后,它會進行條件測試,而且在每一次迭代結束時,進行某種形式的“步進”。
循環格式如下:
for(initialization ; Boolean-expression ; step)
statement
初始化表達式(initialization)、布爾表達式(Boolean-expression )或者步進(step)運算,都可以為空。每次迭代前會測試布爾表達式。若獲得的結果是 false,就會跳過循環體并執行for語句后面的代碼。每次循環結束,會執行一次步進。
public class Test {

public static void main(String[] args) {
    for(int i = 0; i < 10;i++) {
        System.out.println(i);
    }
}//輸出:0123456789

}

這段代碼的意思是“循環輸出i的值”

foreach語法
Java SE5引入了一種新的更加簡潔的for語法用于數組和容器,即foreach語法,表示不必創建int變量去對由訪問項構成的序列進行計數,foreach將自動產生毎一項。

public class Test {

public static void main(String[] args) {
    int[] ints = new int[]{0,1,2,3,4};
    for(int i :ints) {
        System.out.print(i);
    }
}//輸出:01234

上面代碼語句定義了一個int類型的數組ints,并且在循環語句中定義了一個int類型的變量i,循環時將數組ints中的元素賦值給i。任何返回一個數組的方法或集合都可以使用 foreach語法。String類有一個方法toCharArray(),它返回一個char數組亦能應用foreach語法。

標簽
編程語言中一開始就有goto關鍵詞了。事實上,goto起源于匯編語言的程序控制:“若條件A成立,則跳到這里,否則跳到那里”。如果閱讀由編譯器最終生成的匯編代碼,就會發現程序控制執行流程控制里包含了許多跳轉。(Java編譯器生成它自己的“匯編代碼”,但是這個代碼是運行在Java虛擬機上的,而不是直接運行在CPU硬件上)
盡管goto仍是Java中的一個保留字,但在語言中并未使用它,Java沒有goto,然而,Java也能完成一些類似于跳轉的操作,這與break和continue這兩個關鍵詞有關。它們其實不是一個跳轉,而是中斷迭代語句的一種方法。之所以把它們納入goto問題中一起討論,是由于它們使用了相同的機制:標簽。
標簽是后面跟有冒號的標識符,就像下面這樣:
labell:
在Java中,標簽起作用的唯一的地方剛好是在迭代語句之前。“剛好之前”的意思表明,在標簽和迭代之間置入任何語句都不好。而在迭代之前設置標簽的唯一理由是:我們希望在其中嵌套另一個迭代或者一個開關。這是由于break和continue關鍵詞通常只中斷當前循環,但若隨同標簽一起使用,它們就會中斷循環,直到標簽所在的地方:
label1:
outer-iteration{
inner-iteration{
//…
break;//(1)
//…
continue;//(1)
//…
continue label1;//(1)
//…
break label1;//(1)
}
}
在(1)中,break中斷內部迭代,回到外部迭代。
在(2)中,continue使執行點移回內部迭代的起始處。
在(3)中,continue label1同時中斷內部迭代以及外部迭代,直接轉到label1處,隨后,它實際上是繼續迭代過程,但卻從外部迭代開始。
在(4)中,break label1也會中斷所有迭代,并回到label1處,但并不重新進人迭代。也就是說,它實際是完全中止了兩個迭代。

return
在Java中有多個關鍵詞表示無條件分支,它們只是表示這個分支無需任何測試即可發生。這些關鍵詞包括return、break、continue
return關鍵詞有兩方面的用途,一方面指定一個方法返回什么值(假設它沒有void返回值),另一方面它會導致當前的方法退出,并返回那個值。如果在返回void的方法中沒有return語句,那么在該方法的結尾處會有一個隱式的return,因此在方法中并非總是必須要有一個return語句。但是如果一個方法聲明它將返回void之外的其他東西,那么必須確保每一條代碼路徑都將返回一個值。

public class Test {

public static String testReturn(int i) {
    if(i == 1) {
        return "傳進來的值是1";
    }else if(i == 2) {
        return "傳進來的值是2";
    }else {
        return "傳進來的值未知";
    }
}

public static void main(String[] args) {
    int i = 1;
    String str = Test.testReturn(i);
    System.out.println(str);
}//輸出:傳進來的值是1

}

break 和continue
在任何迭代語句的主體部分,都可用break和continue控制循環的流程。其中,break用于強行退出循環,不執行循環中剩余的語句。而continue則停止執行當前的迭代,然后退回循環起始處,開始下一次迭代。

public class Test {

public static void main(String[] args) {
    for(int i = 0; i < 10 ; i++){
        if(i%2 == 0){
            continue;
        }else if(i == 9){
            System.out.print(i+",退出循環");
        }else{
            System.out.print(i+",");
        }
    }
}//輸出:1,3,5,7,9,退出循環

}

在上面的for循環中,i的值永遠不會達到10,因為一旦i達到9,break語句就用中斷循環。同時上面的循環中也不會輸出偶數,因為一旦i為偶數時,continue語句就會停止執行當前的循環,并進入下一次循環起始處。

switch
switch語句是實現多路選擇(也就是說從一系列執行路徑中挑選一個)的一種干凈利落的方法。它要求使用一個選擇因子(byte、short、char、int、enum(Java 5)、String(Java 7))。switch有時也被劃歸為一種選擇語句,根據表達式的值,switch語句可以從一系列代碼中選出一段去執行。它的格式如下:
switch(integral-selector){
case integral-value1 : statement;break;
case integral-value2 : statement;break;
case integral-value3 : statement;break;
case integral-value4 : statement;break;
//…
default : statement;
}
其中,Integral-selector(選擇因子)是一個能夠產生數值的表達式,switch能將這個表達式的結果與每個integral-value (數值)相比較。若發現相符的,就執行對應的語句(單一語句或多條語句,其中并不需要花括號)。若沒有發現相符的,就執行default(默認)語句。
在上面的定義中,大家會注意到每個case均以一個break結尾,這樣可使執行流程跳轉至switch主體的末尾。這是構建switch語句的一種傳統方式,但break是可選的。若省略break,會繼續執行后面的case語句,直到遇到一個break為止。盡管通常不想出現這種情況,但對有經驗的程序員來說,也許能夠善加利用這種情況。注意最后的default語句沒有break,因為執行流程已到了 break的跳轉目的地。當然,如果考慮到編程風格方面的原因,完全可以在default語句的末尾放置一個break,盡管它并沒有任何實際的用處。

public class Test {

public static void main(String[] args) {
    String str = "123";
    switch (str) {
    case "1":
        System.out.println("1");
        break;
    case "2":
        System.out.println("2");
        break;
    case "3":
        System.out.println("3");
        break;
    default:
        System.out.println("default");
        break;
    }
}//輸出:default

}

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容