1. Giới thiệu
Hãy bắt đầu với một câu hỏi: tại sao phương thức lại cần phải trả về điều gì đó? Tại sao không làm mọi thứ bên trong phương thức rồi chỉ in kết quả ra màn hình?
Vấn đề là thường thì chúng ta không chỉ cần thực hiện một hành động, mà còn cần nhận được kết quả để dùng ở các phần khác của chương trình. Ví dụ:
- Một phương thức tính tổng của hai số và trả về tổng đó để chúng ta có thể dùng kết quả cho các phép tính tiếp theo.
- Một phương thức xác định một số có chẵn hay không và trả về true hoặc false để chúng ta có thể đưa ra quyết định.
- Một phương thức trả về chuỗi chào mừng cho người dùng, còn chúng ta quyết định chuyển nó đi đâu — in ra màn hình, ghi vào tệp hoặc gửi qua mạng.
Nếu các phương thức luôn chỉ in ra kết quả, chương trình của chúng ta sẽ bị ràng buộc chặt vào một kịch bản duy nhất và rất khó tái sử dụng logic. Giá trị trả về giúp phương thức linh hoạt và dùng lại được.
Ẩn dụ
Hãy tưởng tượng một máy bán cà phê. Bạn bỏ tiền vào, nhấn nút — và nhận được cà phê. Nếu máy chỉ nói to “Cà phê đã pha xong!” (nhưng không đưa cà phê ra), bạn hẳn sẽ không vui. Phương thức cũng vậy: đôi khi chúng ta không chỉ muốn nghe “Xong rồi!”, mà còn muốn nhận được kết quả.
2. Kiểu giá trị trả về: phương thức có thể trả về gì
Trong Java, khi bạn khai báo một phương thức, bạn chỉ định kiểu giá trị trả về — có thể là bất kỳ kiểu nào: int, double, String, boolean, mảng, thậm chí đối tượng của lớp do bạn định nghĩa. Nếu phương thức không trả về gì — dùng void.
Cú pháp:
tip_vozvrashchaemogo_znacheniya imyaMetoda(parametry)
{
// thân phương thức
}
Ví dụ:
int sum(int a, int b)
{
// trả về int
}
String getGreeting(String name)
{
// trả về String
}
boolean isEven(int number)
{
// trả về boolean
}
void printHello()
{
// không trả về gì — chỉ thực hiện hành động
}
Quan trọng! Kiểu giá trị trả về là “cam kết” của phương thức: nó bắt buộc phải trả về một giá trị thuộc kiểu đó. Nếu bạn hứa trả về int nhưng lại trả về String — trình biên dịch sẽ báo lỗi và không cho biên dịch chương trình.
3. Toán tử return: làm thế nào để trả về giá trị từ phương thức
Để thực sự “trao” kết quả của phương thức ra bên ngoài, ta dùng toán tử return. Từ khóa này có nghĩa là: “Đây, nhận kết quả — và công việc của tôi kết thúc tại đây”.
int sum(int a, int b)
{
int result = a + b;
return result; // trả về kết quả
}
Cũng có thể ngắn gọn hơn:
int sum(int a, int b)
{
return a + b;
}
Khi phương thức gặp dòng return, nó kết thúc thực thi, trả về giá trị chỉ định và chuyển nó về nơi đã gọi.
Lưu ý: kiểu của giá trị sau return phải khớp với kiểu đã khai báo của phương thức.
4. Sử dụng giá trị trả về: dùng vào đâu?
Khi phương thức trả về một giá trị, bạn có thể:
- Lưu vào một biến.
- Dùng trực tiếp trong biểu thức.
- Truyền cho phương thức khác.
int result = sum(5, 7); // lưu vào biến
System.out.println(result); // in ra kết quả
System.out.println(sum(10, 20)); // in trực tiếp kết quả
if (isEven(42))
{
System.out.println("Số chẵn!");
}
Ví dụ: phương thức trả về chuỗi
String getGreeting(String name)
{
return "Xin chào, " + name + "!";
}
// Sử dụng:
String greeting = getGreeting("Alisa");
System.out.println(greeting); // Xin chào, Alisa!
5. Thực hành: các ví dụ về phương thức có giá trị trả về
Phương thức trả về giá trị lớn nhất của hai số
int max(int a, int b)
{
if (a > b)
{
return a;
}
else
{
return b;
}
}
Còn có thể ngắn hơn nếu bạn đã quen với toán tử ba ngôi:
int max(int a, int b)
{
return (a > b) ? a : b;
}
Cách dùng:
int maximum = max(10, 25);
System.out.println("Giá trị lớn nhất: " + maximum); // Giá trị lớn nhất: 25
Phương thức trả về true nếu số là số chẵn
boolean isEven(int number)
{
return number % 2 == 0;
}
Cách dùng:
if (isEven(18))
{
System.out.println("Số chẵn!");
}
else
{
System.out.println("Số lẻ!");
}
Phương thức trả về tổng các phần tử của mảng
int sumArray(int[] arr)
{
int sum = 0;
for (int i = 0; i < arr.length; i++)
{
sum += arr[i];
}
return sum;
}
Cách dùng:
int[] grades = {5, 4, 3, 5, 4};
int total = sumArray(grades);
System.out.println("Tổng điểm: " + total);
6. Điều gì xảy ra khi gọi phương thức có return
Khi bạn gọi một phương thức có giá trị trả về, luồng thực thi sẽ “đi vào” bên trong phương thức, chạy mã của nó, gặp return, trả về giá trị — và thay thế nó vào đúng vị trí lời gọi.
Minh họa (sơ đồ):
int a = 2;
int b = 3;
int c = sum(a, b); // ở đây gọi sum(2, 3), trả về 5, c trở thành 5
Sơ đồ khối
graph TD
A["main"] --> B["sum(a, b)"]
B --> C[tính toán]
C --> D[return result]
D -->|kết quả được trả về| A
7. Những điểm hữu ích
return kết thúc việc thực thi phương thức
Ngay khi trong phương thức xuất hiện return, việc thực thi phương thức lập tức bị dừng lại. Tất cả những gì viết sau đó — sẽ không chạy.
int test()
{
return 42;
System.out.println("Dòng này sẽ không được in"); // unreachable
}
return trong phương thức kiểu void
Trong phương thức void (không trả về gì) bạn có thể dùng return không kèm giá trị — chỉ để kết thúc sớm việc thực thi phương thức, ví dụ khi thỏa một điều kiện nào đó.
void printPositive(int number)
{
if (number <= 0)
{
System.out.println("Số không phải số dương!");
return; // thoát khỏi phương thức
}
System.out.println("Số: " + number);
}
8. Những lỗi thường gặp khi làm việc với return
Lỗi số 1: Không phải mọi nhánh đều trả về giá trị
int getSign(int number)
{
if (number > 0)
{
return 1;
}
// Nếu number <= 0 thì sao? Không có return!
}
// Lỗi: không phải mọi nhánh của mã đều trả về giá trị
Cách khắc phục: luôn đảm bảo có return trên mọi nhánh thực thi.
int getSign(int number)
{
if (number > 0)
{
return 1;
}
else if (number < 0)
{
return -1;
}
else
{
return 0;
}
}
Lỗi số 2: Kiểu giá trị trả về không khớp
int getNumber()
{
return "42"; // Lỗi! Mong đợi int, không phải String
}
Lỗi số 3: return sau return
int test()
{
return 5;
System.out.println("Dòng này sẽ không thực thi"); // unreachable statement
}
Lỗi số 4: return kèm biểu thức trong phương thức void
void printSomething()
{
return 42; // Lỗi! Phương thức void không thể trả về giá trị
}
Lỗi số 5: Bỏ qua giá trị trả về
sum(10, 20); // thế là hết? Kết quả bị bỏ đi!
Nếu bạn không sử dụng giá trị trả về, nó sẽ bị mất. Đừng quên lưu lại hoặc truyền tiếp trong mã!
Lỗi số 6: Nghĩ rằng return sẽ in ra thứ gì đó
int result = sum(2, 3);
// return không in ra gì cả!
// Cần in ra một cách rõ ràng:
System.out.println(result);
GO TO FULL VERSION