Java 學習筆記 05 – 流程控制


Posted by vickyh1315 on 2024-04-16

前面例子都是以單句的宣告或賦值就完成了指令,且由上到下執行,但現實中情況的複雜得多。
流程控制的語法就是為了讓電腦知道複雜的邏輯,控制它何時該做什麼,完成指定功能的模組。

一般而言程式從上而下執行,但使用流程控制,能突破這個限制,主要透過條件判斷、迴圈循環語法來實現。

條件判斷

if/else

當滿足條件式,就執行 if 指定區段,否則執行 else 裡面區段。

if(條件式)
    敘述區段1;
else
    敘述區段2;
if(條件式) {
    敘述區段1;
    敘述區段2;
 }
 else if {
    敘述區段3;
    敘述區段4;
 } else {
    敘述區段5;
    敘述區段6;
 }

例子:讀取輸入值,判斷是整數印出數字,不是則出現警告。

public class IfStatementRunner {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("輸入一個數字:");
        if(scanner.hasNextInt()) {
            int num = scanner.nextInt();
            System.out.println("輸入整數:%d", num);
        }
        else {
            System.out.println("請輸入有效的整數!");
        }

    }
}

需要留意的是,if 的括號裡只能放 boolean,放入非 boolean 編譯會報錯。

int i = 0;
if(i) {
    System.out.println("i");
}

Compiler Error
The code snippet will result in a compiler error because the condition if(i) requires a boolean expression, but i is an integer value.

switch

switch 取出括號中的變數或運算式,與 case 中設定的數字或字元、字串比對,符合就執行裡面的敘述句,當遇到 break 就停止執行,比對到最後都沒有符合的數值或文字,就執行 default 裡面的敘述句。
需注意的是,switch 結構的變數名稱或運算式,只能是 byte、short、char、int、enum、String。

switch(變數名稱或運算式) { 
    case 常量:
        敘述區段1; 
        break; 
    case 常量: 
        敘述區段2; 
        break; 
    default: // 可省略
        敘述區段3; 
}

例子:

public class SwitchStatementRunner {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("輸入一個數字,代表星期幾:");
        int day = scanner.nextInt();
        String dayOfWeek = "";
        switch(day) {
            case 0: dayOfWeek = "Sunday"; break;
            case 1: dayOfWeek = "Monday"; break;
            case 2: dayOfWeek = "Tuesday"; break;
            case 3: dayOfWeek = "Wednesday"; break;
            default: throw new IllegalArgumentException("Invalid Option: "+day);
        }
        return dayOfWeek;
    }
}

從 Java 14 開始,融入 Lambda 表達式,提供簡化寫法,不用寫 break,就可以中斷語句。

// 改寫上述例子
public class SwitchExpressionRunner {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("輸入一個數字,代表星期幾:");
        int day = scanner.nextInt();
        String dayOfWeek = switch(day) {
            case 0 -> {
                System.out.println("Do some logic here");
                yield "Sunday";
            }
            case 1 -> "Monday";
            case 2 -> "Tuesday";
            case 3 -> "Wednesday";
            default -> throw new IllegalArgumentException("Invalid Option: "+day);
        };
        return dayOfWeek;
    }
}

迴圈循環

while / do while

while 迴圈通常用在不確定執行次數的情境,當符合條件,就會執行回圈內的程式,也因不限制執行次數,需避免發生無窮迴圈。

// a 初始化
while(條件式) { // b 迴圈條件判斷
    // c 迴圈執行程式
    // d 迭代程式
}

迴圈執行過程會是:a → b → c → d → b → c → d → ... → b
迭代程式一定要有,否則就會出現無窮迴圈情形。
結束迴圈可以透過條件式的 false (配合迭代程式)跟 break。

public class WhileRunner {
    public static void main(String[] args) {
        // a 初始化
        int sum = 0;
        int i = 1;
        while(i<100) { // b 迴圈條件判斷
            sum += i; // c 迴圈執行程式
            i++; // d 迭代程式
        }
    }
}

do while 至少執行一次迴圈,會先執行本體程式,下一次才開始判斷條件。

// a 初始化
do { 
    // c 迴圈執行程式
    // d 迭代程式
 } while(條件式); // b 迴圈條件判斷

迴圈執行過程:a → c → d → b → c → d → b → c → d → b
一樣,迭代程式一定要有。

for

for(a 初始化; b 條件式; d 迭代程式) {
    c 迴圈程式;
}

迴圈執行過程:a → b → c → d → b → c → d → ... → b
for 比起 while 不同的是,初始化部分可以宣告一個以上的變數,也支援多個變數的更新。
迴圈條件透過 false 退出迴圈。

public class ForRunner {
    public static void main(String[] args) {
        int sumI = 0;
        int sumJ = 0;
        for(int i=0, j=10; i<=10 && j<=10000; i++, j*=10) {
            sumI+=i;
            sumJ+=j;
        }
        System.out.println("sumI: " + sumI);
        System.out.println("sumJ: " + sumJ);
    }
}

for 跟 while、do while 可以混合使用,也能用巢狀的方式寫出迴圈。

break、continue、return

break

break 用在終止執行某個區塊的程式,只能寫在 switch 跟迴圈裡。

continue

continue 用在跳出區塊程式的執行,繼續下一次的循環,只能用在迴圈。

return

當方法執行到 return,這個方法將會結束,不會繼續後面的程式跟迴圈,用途不限於迴圈跟假設語句,包含整個方法。

根據結構化設計,任何程式邏輯只有一輸入與一輸出,會是從三種基本架構之一構成

  • 循序結構
  • 選擇結構
  • 重複結構

順序結構即從上到下執行的程式,沒有判斷和跳轉的情況。
分支結構會根據條件(boolean)執行指定區段的程式,if else、switch、三元運算子就屬這種分支結構。
循環結構根據有無滿足循環條件(boolean),可以重複執行區塊內程式,例如 while/do while、for。


#java







Related Posts

執行緒與同步、非同步概念

執行緒與同步、非同步概念

從找房子理解 ETL scheduling

從找房子理解 ETL scheduling

[ 筆記 ] React 04 - 如何寫 CSS

[ 筆記 ] React 04 - 如何寫 CSS


Comments