CodeSprout程式萌芽

CHAPTER 02 · JAVA 11 FOUNDATIONS

Java 流程控制

用條件選擇執行路線,用迴圈處理重複工作,追蹤 break、continue 與標籤的作用範圍。

這一章學會
  • 使用 if/else 與 Java 11 switch
  • 選擇 for、for-each、while、do-while
  • 正確處理迴圈邊界與流程跳轉
先預測結果,再看輸出。

每個 Java 範例都是獨立的 Main.java,可用 JDK 11 編譯執行;請一次複製一個範例。題庫使用 public class Solution 中的 public static solve(...) 方法,請保留題目指定的型別與參數,使用 return 交回答案,不必另外讀取輸入或撰寫 main。

01|if、else if 與 else

if 的條件必須得到 boolean。if/else if/else 由上到下檢查,只執行第一個符合的分支。條件較嚴格的門檻應先檢查;即使只有一行,也保留大括號,避免新增敘述後改變意思。

JAVA 11 · Main.java程式碼
public class Main {
    public static void main(String[] args) {
        int score = 85;
        if (score >= 90) {
            System.out.println("A");
        } else if (score >= 75) {
            System.out.println("B");
        } else if (score >= 60) {
            System.out.println("C");
        } else {
            System.out.println("再練習");
        }
    }
}
預期輸出
B

教材對照:PDF 第 2–5 頁

02|switch 的 case、default 與 break

Java 11 使用傳統 switch 敘述:case 值後放冒號,依需要用 break 離開。匹配後若沒有 break,會往下執行後續敘述,稱為 fall-through,不會再比對下一個 case。default 處理沒有匹配的情況,最多一個。

  • Java 11 支援 byte、short、char、int、對應包裝型別、String 與 enum;不支援 long、float、double、boolean。
  • 一般 case 須為可在編譯期確定的常數,且不可重複;僅加上 final 不代表一定是編譯期常數。enum 使用其列舉常數。
  • switch 的 String 比較依內容、區分大小寫;null 不能直接放入此處的 switch。
  • 本課使用 Java 11,不使用較新版本的箭頭 switch、switch expression 或 yield。
JAVA 11 · Main.java程式碼
public class Main {
    public static void main(String[] args) {
        String day = "SAT";
        switch (day) {
            case "SAT":
            case "SUN":
                System.out.println("假日");
                break;
            case "MON":
                System.out.println("新的一週");
                break;
            default:
                System.out.println("上課日");
        }
    }
}
預期輸出
假日

教材對照:PDF 第 6–16 頁

03|for 的初始化、條件與步進

for (初始化; 條件; 步進) 的初始化只執行一次;每次先檢查條件,成立才執行主體,之後做步進,再回到條件。條件可一開始就是 false,因此主體不保證執行。

JAVA 11 · Main.java程式碼
public class Main {
    public static void main(String[] args) {
        int sum = 0;
        for (int i = 1; i <= 5; i++) {
            sum += i;
        }
        System.out.println(sum);
        for (int left = 0, right = 2; left <= right; left++, right--) {
            System.out.println(left + ":" + right);
        }
    }
}
預期輸出
15
0:2
1:1

教材對照:PDF 第 17–18、21–23 頁

04|巢狀迴圈與二維資料

外層每走一步,內層就完整執行一輪。教材用九九乘法表說明這個規律;下例縮成兩列三欄,先觀察 row、column 如何改變,再自行擴大。迴圈次數通常相乘,資料很大時要留意工作量。

JAVA 11 · Main.java程式碼
public class Main {
    public static void main(String[] args) {
        for (int row = 1; row <= 2; row++) {
            for (int column = 1; column <= 3; column++) {
                System.out.println(row + "*" + column + "=" + row * column);
            }
        }
    }
}
預期輸出
1*1=1
1*2=2
1*3=3
2*1=2
2*2=4
2*3=6

教材對照:PDF 第 18–19、25 頁

05|break 與 continue

break 結束最近一層迴圈或 switch;continue 跳過本輪剩餘程式。for 的 continue 會先做步進,再檢查條件。以下先處理停止條件,再跳過 3 的倍數,最後才把數字加到總和。

JAVA 11 · Main.java程式碼
public class Main {
    public static void main(String[] args) {
        int sum = 0;
        for (int i = 1; i <= 10; i++) {
            if (i == 8) {
                break;
            }
            if (i % 3 == 0) {
                continue;
            }
            sum += i;
        }
        System.out.println(sum);
    }
}
預期輸出
19

教材對照:PDF 第 19–23、28、31 頁

06|for-each 與多維陣列

for (型別 變數 : 陣列或 Iterable) 依序取得每個元素,不需要手動維護索引。二維資料可先取得一列,再取得列內元素。若要修改陣列元素或使用索引,傳統 for 常較直接。

JAVA 11 · Main.java程式碼
public class Main {
    public static void main(String[] args) {
        int[][] rows = {{2, 4}, {6}};
        int sum = 0;
        for (int[] row : rows) {
            for (int value : row) {
                sum += value;
                value = 0;
            }
        }
        System.out.println(sum);
        System.out.println(rows[0][0]);
    }
}
預期輸出
12
2

教材對照:PDF 第 24–26 頁

07|while 先判斷,do-while 先做一次

while 適合以條件決定是否繼續;每輪執行前都要判斷。do-while 則先執行一次,再檢查條件,適合至少要操作一次的流程。do-while 的 while (...) 後面必須加分號。

JAVA 11 · Main.java程式碼
public class Main {
    public static void main(String[] args) {
        int remaining = 3;
        while (remaining > 0) {
            System.out.println(remaining);
            remaining--;
        }
        int attempts = 0;
        do {
            attempts++;
        } while (attempts < 0);
        System.out.println("嘗試次數=" + attempts);
    }
}
預期輸出
3
2
1
嘗試次數=1

教材對照:PDF 第 27–31 頁

08|label 指定離開哪一層

label 是敘述前的標籤,本身不改變執行方向。break outer 可離開名為 outer 的整段迴圈;continue outer 則繼續該外層迴圈的下一輪。Java 沒有可用的 goto 敘述。標籤需要清楚命名,避免複雜跳轉。

JAVA 11 · Main.java程式碼
public class Main {
    public static void main(String[] args) {
        int[][] grid = {{1, 2}, {3, 4}};
        int foundRow = -1;
        outer:
        for (int row = 0; row < grid.length; row++) {
            for (int value : grid[row]) {
                if (value == 3) {
                    foundRow = row;
                    break outer;
                }
            }
        }
        System.out.println(foundRow);
    }
}
預期輸出
1

教材對照:PDF 第 20–21、26 頁

WHEN SOMETHING GOES WRONG

遇到錯誤,先檢查這裡

索引到 length 還繼續取值

最後一個有效索引是 length - 1;一般走訪陣列應寫 i < values.length。測試空陣列與只有一個元素的情況。

switch 印出多個分支

檢查匹配後是否缺少 break,並區分刻意共用 case 與意外落入後續分支。

continue 讓計數永遠不變

逐行追蹤 continue 的目的地。尤其在 while 中,先確保每輪都能更新狀態,或有可達到的 break。

PAUSE AND TRY

先不要急著看別人的寫法

  1. 把分級成績改成 90、75、60、59,分別會進哪個分支?
  2. 將第五節的 break 與 continue 條件對調,再改停止數字為 6,會有何差異?
  3. 用 while 計算 1 到 5 的總和,與 for 版本比對。

先用紙筆預測,再改動範例中的數字或文字。結果與預期不同時,找出最早開始不同的那一步。

把這幾件事帶走

  • 條件與邊界先寫成文字,再翻成布林運算式。
  • for 管步數,for-each 讀元素,while 管條件。
  • 每次遇到 break/continue 都標出它影響的那一層。

FROM READING TO PRACTICE

用三道免費題,練習本章觀念

先做簡單題確認語法,再把幾個步驟組合起來。三題都來自本章主題的 Java 免費題庫,難度表示需要組合的基本概念。

教材來源與 Java 11 對照

本章依據《第二部分 02 Java 流程控制.pdf》PDF 第 2–31 頁整理,將原有觀念重新編寫為可閱讀與執行的網站教學。頁碼為 PDF 檔案頁次;舊版語法說明與已知誤植依 Java 11 修正,補充內容另有標示。

需要查閱更完整的規則時,可參考以下官方文件。