break語句
break語句有兩種形式:標籤和非標籤。在前面的switch語句,看到的break語句就是非標籤形式。可以使用非標籤break,結束for,while,do-while迴圈,如下面的BreakDemo程式:
class BreakDemo { public static void main(String[] args) { int[] arrayOfInts = { 32, 87, 3, 589, 12, 1076, 2000, 8, 622, 127 }; int searchfor = 12; int i; boolean foundIt = false; for (i = 0; i < arrayOfInts.length; i++) { if (arrayOfInts[i] == searchfor) { foundIt = true; break; } } if (foundIt) { System.out.println("Found " + searchfor + " at index " + i); } else { System.out.println(searchfor + " not in the array"); } }}
這個程式在數組終尋找數字12。break語句,如上的粗體,當找到只時,結束for迴圈。控制流程就跳轉到for迴圈後面的語句。程式輸出是:
Found 12 at index 4
無標籤break語句結束最裡面的switch,for,while,do-while語句。而標籤break結束最外面的語句。接下來的程式,BreakWithLabelDemo,類似前面的程式,但使用嵌套迴圈在二維數組裡尋找一個值。但值找到後,標籤break語句結束最外面的for迴圈(標籤為"search"):
class BreakWithLabelDemo { public static void main(String[] args) { int[][] arrayOfInts = { { 32, 87, 3, 589 }, { 12, 1076, 2000, 8 }, { 622, 127, 77, 955 } }; int searchfor = 12; int i; int j = 0; boolean foundIt = false; search: for (i = 0; i < arrayOfInts.length; i++) { for (j = 0; j < arrayOfInts[i].length; j++) { if (arrayOfInts[i][j] == searchfor) { foundIt = true; break search; } } } if (foundIt) { System.out.println("Found " + searchfor + " at " + i + ", " + j); } else { System.out.println(searchfor + " not in the array"); } }}
程式輸出是:
Found 12 at 1, 0
break語句結束標籤語句,它不是傳送控制流程到標籤處。控制流程傳送到緊隨標記(終止)聲明。
continue語句
continue語句忽略for,while,do-while的當前迭代。非標籤模式,忽略最裡面的迴圈體,然後計算迴圈控制的boolean運算式。接下來的程式,ContinueDemo,通過一個字串的步驟,計算字母“p”出現的次數。如果當前字元不是p,continue語句跳過迴圈的其他代碼,然後處理下一個字元。如果當前字元是p,程式自增字元數。
class ContinueDemo { public static void main(String[] args) { String searchMe = "peter piper picked a " + "peck of pickled peppers"; int max = searchMe.length(); int numPs = 0; for (int i = 0; i < max; i++) { // interested only in p's if (searchMe.charAt(i) != 'p') continue; // process p's numPs++; } System.out.println("Found " + numPs + " p's in the string."); }}
這裡是程式輸出:
Found 9 p's in the string.
為了更清晰看效果,嘗試去掉continue語句,重新編譯。再跑程式,count將是錯誤的,輸出是35,而不是9.
標籤continue語句忽略標籤標記的外層迴圈的當前迭代。下面的程式例子,ContinueWithLabelDemo,使用嵌套迴圈在字元傳的字串中搜尋字串。需要兩個嵌套迴圈:一個迭代字串,一個迭代正在被搜尋的字串。下面的程式ContinueWithLabelDemo,使用continue的標籤形式,忽略最外層的迴圈。
class ContinueWithLabelDemo { public static void main(String[] args) { String searchMe = "Look for a substring in me"; String substring = "sub"; boolean foundIt = false; int max = searchMe.length() - substring.length(); test: for (int i = 0; i <= max; i++) { int n = substring.length(); int j = i; int k = 0; while (n-- != 0) { if (searchMe.charAt(j++) != substring.charAt(k++)) { continue test; } } foundIt = true; break test; } System.out.println(foundIt ? "Found it" : "Didn't find it"); }}
這裡是程式輸出:
Found it
return語句
最後的分支語句是return語句。return語句從當前方法退出,控制流程返回到方法調用處。return語句有兩種形式:一個是傳回值,一個是不傳回值。為了返回一個值,簡單在return關鍵字後面把值放進去(或者放一個運算式計算)
return ++count;
return的值的資料類型,必須和方法聲明的傳回值的類型符合。當方法聲明為void,使用下面形式的return不需要傳回值。
return;