CodeGym /課程 /JAVA 25 SELF /回傳值、return

回傳值、return

JAVA 25 SELF
等級 8 , 課堂 3
開放

1. 導言

先從一個問題開始:方法到底為什麼要回傳東西?為什麼不能乾脆把所有事都在方法內做完,然後把結果直接輸出到螢幕上?

原因在於,我們常常不只是要執行某個動作,還需要取得一個結果,日後可以在程式的其他部分使用。比如:

  • 方法計算兩個數的總和並回傳,讓我們能把結果拿去做進一步運算。
  • 方法判斷某個數是否為偶數,並回傳 truefalse,讓我們能做出決策。
  • 方法回傳一段給使用者的問候字串,而我們再決定把它用在哪裡——顯示在螢幕上、寫入檔案、或透過網路傳送。

如果方法總是只會印出結果,我們的程式就會被綁死在單一情境,想要重複使用該邏輯就會很麻煩。回傳值讓方法更有彈性,也更通用。

類比

想像一下咖啡販賣機。你投入錢、按下按鈕——然後拿到咖啡。如果販賣機只是大聲說「咖啡煮好了!」(但不給你咖啡),你一定不會高興。方法也是如此:有時候我們不只是想聽到「完成!」,而是真的要拿到一個結果。

2. 回傳型別:方法可以回傳什麼

在 Java 中,宣告方法時需要指定回傳值的型別——可以是任何型別:intdoubleStringboolean、陣列,甚至是你自己類別的物件。如果方法什麼都不回傳——就寫 void

語法:

tip_vozvrashchaemogo_znacheniya imyaMetoda(parametry)
{
    // 方法本體
}
方法簽名

範例:

int sum(int a, int b) 
{
    // 回傳 int
}

String getGreeting(String name) 
{
    // 回傳 String
}

boolean isEven(int number) 
{
    // 回傳 boolean
}

void printHello() 
{
    // 不回傳任何值——只執行動作
}

重要! 回傳型別是方法的「承諾」:它必須回傳該型別的值。如果你承諾回傳 int,卻回傳了 String——編譯器會提出異議並拒絕編譯程式。

3. 運算子 return:如何從方法回傳值

要把方法的執行結果真正「交出去」,就要使用 return。這個關鍵字的意思是: 「給你結果——而我的工作到此結束」。

int sum(int a, int b) 
{
    int result = a + b;
    return result; // 回傳結果
}
透過 return 回傳值

還可以更簡短:

int sum(int a, int b) 
{
    return a + b;
}

當方法執行到 return 這一行時,它就會結束執行、回傳指定的值,並把該值交回到被呼叫的位置。

重要: return 後面的值,其型別必須與方法宣告的回傳型別一致。

4. 使用回傳值:該拿它做什麼?

當方法回傳了某個值,你可以:

  • 把它存到變數。
  • 直接在運算式中使用。
  • 傳給其他方法。
int result = sum(5, 7); // 存到變數
System.out.println(result); // 輸出結果

System.out.println(sum(10, 20)); // 直接輸出結果

if (isEven(42)) 
{
    System.out.println("這個數是偶數!");
}

範例:回傳字串的方法

String getGreeting(String name) 
{
    return "你好," + name + "!";
}

// 使用方式:
String greeting = getGreeting("Alisa");
System.out.println(greeting); // 你好,Alisa!

5. 實作:具有回傳值的方法範例

回傳兩數之最大值的方法

int max(int a, int b) 
{
    if (a > b) 
    {
        return a;
    } 
    else 
    {
        return b;
    }
}

如果你已經掌握了三元運算子,還能更精簡:

int max(int a, int b) 
{
    return (a > b) ? a : b;
}

使用方式:

int maximum = max(10, 25);
System.out.println("最大值:" + maximum); // 最大值:25

回傳 true(若數字為偶數)的方法

boolean isEven(int number) 
{
    return number % 2 == 0;
}

使用方式:

if (isEven(18)) 
{
    System.out.println("這個數是偶數!");
} 
else 
{
    System.out.println("這個數是奇數!");
}

回傳陣列元素總和的方法

int sumArray(int[] arr) 
{
    int sum = 0;
    for (int i = 0; i < arr.length; i++) 
    {
        sum += arr[i];
    }
    return sum;
}

使用方式:

int[] grades = {5, 4, 3, 5, 4};
int total = sumArray(grades);
System.out.println("成績總和:" + total);

6. 呼叫含 return 的方法時會發生什麼

當你呼叫一個有回傳值的方法時,程式的執行就像「進入」方法內,執行它的程式碼,遇到 return 時回傳值——然後把該值帶回並替換呼叫處。

示意:

int a = 2;
int b = 3;
int c = sum(a, b); // 這裡呼叫了 sum(2, 3),回傳 5,c 變為 5

流程圖

        graph TD
        A["main"] --> B["sum(a, b)"]
        B --> C[計算]
        C --> D[return result]
        D -->|結果被回傳| A
    

7. 實用細節

return 會結束方法的執行

一旦在方法中遇到 return,方法就會立刻中止。寫在它後面的內容——都不會執行。

int test()
{
    return 42;
    System.out.println("這不會被列印"); // unreachable
}

returnvoid 方法中

在不回傳值的 void 方法中,可以使用不帶值的 return——單純為了提前結束方法,例如在某個條件成立時。

void printPositive(int number)
{
    if (number <= 0) 
    {
        System.out.println("這個數不是正數!");
        return; // 直接結束方法
    }
    System.out.println("數字:" + number);
}

8. 使用 return 時的常見錯誤

錯誤 1:不是所有路徑都會回傳值

int getSign(int number)
{
    if (number > 0) 
    {
        return 1;
    }
    // 那如果 number <= 0 呢?沒有 return!
}
// 錯誤:並非所有程式路徑都回傳值

如何修正: 確保在所有執行路徑上都能執行到 return

int getSign(int number)
{
    if (number > 0) 
    {
        return 1;
    } 
    else if (number < 0) 
    {
        return -1;
    } 
    else 
    {
        return 0;
    }
}

錯誤 2:回傳值型別不相符

int getNumber()
{
    return "42"; // 錯誤!預期是 int,而不是 String
}

錯誤 3:return 之後還有程式碼

int test()
{
    return 5;
    System.out.println("這不會被執行"); // unreachable statement
}

錯誤 4:在 void 方法中用帶表達式的 return

void printSomething()
{
    return 42; // 錯誤!void 方法不能回傳值
}

錯誤 5:忽略回傳值

sum(10, 20); // 就這樣?結果不見了!

如果你不使用回傳值,它就會被丟棄。別忘了把它儲存起來或傳遞到後續的程式碼!

錯誤 6:以為 return 會把內容印出來

int result = sum(2, 3);
// return 什麼也不會列印!
// 需要明確列印:
System.out.println(result);
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION