Flow Control
Java Control Flow
Câu lệnh điều khiển trong Java có thể chia thành ba loại chính:
- Câu lệnh điều kiện
- if, else-if, else
- switch
- Câu lệnh lặp
- while
- do…while
- for
- foreach
- Câu lệnh ngắt
- break
- continue
- return
Câu lệnh điều kiện
Câu lệnh if
Câu lệnh if
kiểm tra xem biểu thức trong dấu ngoặc đơn có đúng hay không. Nếu đúng, thì khối mã lệnh bên trong câu lệnh if
sẽ được thực thi, ngược lại, nó sẽ bỏ qua khối mã lệnh đó và tiếp tục thực thi các câu lệnh tiếp theo.
Cú pháp
if (biểu_thức) {
// Nếu biểu thức là true, thực thi các câu lệnh trong khối này
}
Ví dụ
public class IfDemo {
public static void main(String args[]) {
int x = 10;
if (x < 20) {
System.out.print("Đây là câu lệnh if");
}
}
}
// output:
// Đây là câu lệnh if
Câu lệnh if…else
Câu lệnh if
có thể được kết hợp với câu lệnh else
để thực thi một khối mã lệnh khác khi biểu thức trong câu lệnh if
là sai.
Cú pháp
if (biểu_thức) {
// Nếu biểu thức là true, thực thi các câu lệnh trong khối này
} else {
// Nếu biểu thức là false, thực thi các câu lệnh trong khối này
}
Ví dụ
public class IfElseDemo {
public static void main(String args[]) {
int x = 30;
if (x < 20) {
System.out.print("Đây là câu lệnh if");
} else {
System.out.print("Đây là câu lệnh else");
}
}
}
// output:
// Đây là câu lệnh else
Câu lệnh if…else if…else
- Câu lệnh
if
có thể có tối đa 1 câu lệnhelse
và câu lệnhelse
phải đứng sau tất cả các câu lệnhelse if
. - Câu lệnh
if
có thể có nhiều câu lệnhelse if
, nhưng chúng phải đứng trước câu lệnhelse
. - Một khi một câu lệnh
else if
được thực thi, các câu lệnhelse if
vàelse
khác sẽ được bỏ qua.
Cú pháp
if (biểu_thức 1) {
// Nếu biểu thức 1 là true, thực thi các câu lệnh trong khối này
} else if (biểu_thức 2) {
// Nếu biểu thức 2 là true, thực thi các câu lệnh trong khối này
} else if (biểu_thức 3) {
// Nếu biểu thức 3 là true, thực thi các câu lệnh trong khối này
} else {
// Nếu tất cả các biểu thức trên đều là false, thực thi các câu lệnh trong khối này
}
Ví dụ
public class IfElseifElseDemo {
public static void main(String args[]) {
int x = 3;
if (x == 1) {
System.out.print("Giá trị của X là 1");
} else if (x == 2) {
System.out.print("Giá trị của X là 2");
} else if (x == 3) {
System.out.print("Giá trị của X là 3");
} else {
System.out.print("Đây là câu lệnh else");
}
}
}
// output:
// Giá trị của X là 3
Câu lệnh if lồng nhau
Có thể sử dụng câu lệnh if else
lồng nhau. Điều này có nghĩa là bạn có thể sử dụng câu lệnh if
hoặc else if
trong một câu lệnh if
hoặc else if
khác.
Cú pháp
if (biểu_thức 1) {
// Nếu biểu thức 1 là true, thực thi các câu lệnh trong khối này
if (biểu_thức 2) {
// Nếu biểu thức 2 là true, thực thi các câu lệnh trong khối này
}
}
Ví dụ
public class IfNestDemo {
public static void main(String args[]) {
int x = 30;
int y = 10;
if (x == 30) {
if (y == 10) {
System.out.print("X = 30 và Y = 10");
}
}
}
}
// output:
// X = 30 và Y = 10
Câu lệnh switch
Câu lệnh switch
kiểm tra một biến với một loạt các giá trị để xem nó có bằng với giá trị nào đó hay không. Mỗi giá trị được gọi là một nhánh.
Câu lệnh switch
có các quy tắc sau:
- Kiểu biến trong câu lệnh
switch
chỉ có thể làbyte
、short
、int
、char
hoặcString
. - Câu lệnh
switch
có thể có nhiều câu lệnhcase
. Mỗi câu lệnhcase
được theo sau bởi một giá trị để so sánh và dấu hai chấm. - Kiểu dữ liệu của giá trị trong câu lệnh
case
phải giống với kiểu dữ liệu của biến và chỉ có thể là hằng số hoặc giá trị chữ cái. - Khi giá trị của biến bằng với giá trị trong câu lệnh
case
, các câu lệnh sau câu lệnhcase
đó sẽ được thực thi cho đến khi gặp câu lệnhbreak
. - Khi gặp câu lệnh
break
, câu lệnhswitch
kết thúc. Chương trình nhảy đến câu lệnh sau câu lệnhswitch
. Câu lệnhcase
không nhất thiết phải chứa câu lệnhbreak
. Nếu không có câu lệnhbreak
, chương trình sẽ tiếp tục thực thi câu lệnhcase
tiếp theo cho đến khi gặp câu lệnhbreak
. - Câu lệnh
switch
có thể chứa một nhánhdefault
, nhánh này phải là nhánh cuối cùng của câu lệnhswitch
. Nhánhdefault
sẽ được thực thi khi không có giá trị của câu lệnhcase
nào khớp với giá trị của biến.
Cú pháp
switch (biểu_thức) {
case giá_trị:
// Các câu lệnh
break; // Tùy chọn
case giá_trị:
// Các câu lệnh
break; // Tùy chọn
// Bạn có thể có bất kỳ số lượng câu lệnh case nào
default: // Tùy chọn
// Các câu lệnh
break; // Tùy chọn, nhưng nên có
}
Ví dụ
public class SwitchDemo {
public static void main(String args[]) {
char grade = 'C';
switch (grade) {
case 'A':
System.out.println("Xuất sắc!");
break;
case 'B':
case 'C':
System.out.println("Làm tốt");
break;
case 'D':
System.out.println("Bạn đã qua môn");
case 'F':
System.out.println("Hãy cố gắng thêm");
break;
default:
System.out.println("Điểm không hợp lệ");
break;
}
System.out.println("Điểm của bạn là " + grade);
}
}
// output:
// Làm tốt
// Điểm của bạn là C
Câu lệnh lặp
Vòng lặp while
Vòng lặp while
sẽ tiếp tục thực hiện mã lệnh trong khối lệnh cho đến khi biểu thức boolean trở thành false
.
Cú pháp
while (biểu_thức) {
// mã lệnh
}
Ví dụ
public class WhileDemo {
public static void main(String args[]) {
int x = 10;
while (x < 20) {
System.out.print("giá trị của x : " + x);
x++;
System.out.print("\n");
}
}
}
// output:
// giá trị của x : 10
// giá trị của x : 11
// giá trị của x : 12
// giá trị của x : 13
// giá trị của x : 14
// giá trị của x : 15
// giá trị của x : 16
// giá trị của x : 17
// giá trị của x : 18
// giá trị của x : 19
Vòng lặp do…while
Vòng lặp do…while
tương tự như vòng lặp while
, nhưng khối lệnh sẽ được thực thi ít nhất một lần, ngay cả khi biểu thức boolean là false
.
Cú pháp
do {
// mã lệnh
} while (biểu_thức);
Biểu thức boolean được đặt sau khối lệnh, vì vậy khối lệnh sẽ được thực thi trước khi kiểm tra biểu thức boolean. Nếu giá trị của biểu thức boolean là true
, khối lệnh sẽ được thực thi tiếp tục. Nếu giá trị của biểu thức boolean là false
, vòng lặp sẽ kết thúc và chương trình sẽ tiếp tục thực hiện các câu lệnh sau vòng lặp.
Ví dụ
public class DoWhileDemo {
public static void main(String args[]) {
int x = 10;
do {
System.out.print("giá trị của x : " + x);
x++;
System.out.print("\n");
} while (x < 20);
}
}
// output:
// giá trị của x : 10
// giá trị của x : 11
// giá trị của x : 12
// giá trị của x : 13
// giá trị của x : 14
// giá trị của x : 15
// giá trị của x : 16
// giá trị của x : 17
// giá trị của x : 18
// giá trị của x : 19
Vòng lặp for
Mặc dù tất cả các vòng lặp có thể được biểu diễn bằng cách sử dụng while
hoặc do…while
, nhưng Java cung cấp một cú pháp đặc biệt cho vòng lặp for
, làm cho một số vòng lặp trở nên dễ dàng hơn.
Vòng lặp for
thực hiện một số lần lặp đã biết trước.
Cú pháp
for (khởi_tạo; biểu_thức; cập_nhật) {
// mã lệnh
}
- Đầu tiên, khởi tạo được thực hiện. Bạn có thể khai báo một biến mới hoặc khởi tạo một biến đã tồn tại.
- Sau đó, biểu thức được kiểm tra. Nếu giá trị của biểu thức là
true
, khối lệnh sẽ được thực thi. Nếu giá trị của biểu thức làfalse
, vòng lặp sẽ kết thúc và chương trình sẽ tiếp tục thực hiện các câu lệnh sau vòng lặp. - Sau khi thực hiện khối lệnh, cập nhật được thực hiện. Thường là tăng giá trị của biến điều khiển vòng lặp.
- Sau đó, biểu thức được kiểm tra lại. Quá trình này tiếp tục cho đến khi giá trị của biểu thức là
false
.
Ví dụ
public class ForDemo {
public static void main(String args[]) {
for (int x = 10; x < 20; x = x + 1) {
System.out.print("giá trị của x : " + x);
System.out.print("\n");
}
}
}
// output:
// giá trị của x : 10
// giá trị của x : 11
// giá trị của x : 12
// giá trị của x : 13
// giá trị của x : 14
// giá trị của x : 15
// giá trị của x : 16
// giá trị của x : 17
// giá trị của x : 18
// giá trị của x : 19
Vòng lặp foreach
Java 5 giới thiệu một vòng lặp foreach được sử dụng chủ yếu cho mảng.
Cú pháp
for (kiểu_đối_tượng biến : mảng) {
// mã lệnh
}
kiểu_đối_tượng: Khai báo một biến mới có kiểu dữ liệu của các phần tử trong mảng.
biến: Tên biến mới được khai báo, đại diện cho từng phần tử trong mảng.
mảng: Tên mảng hoặc biểu thức trả về một mảng.
Ví dụ
public class ForeachDemo {
public static void main(String args[]) {
int[] numbers = { 10, 20, 30, 40, 50 };
for (int x : numbers) {
System.out.print(x);
System.out.print(",");
}
System.out.print("\n");
String[] names = { "James", "Larry", "Tom", "Lacy" };
for (String name : names) {
System.out.print(name);
System.out.print(",");
}
}
}
// output:
// 10,20,30,40,50,
// James,Larry,Tom,Lacy,
Câu lệnh ngắt
Từ khóa break
break
được sử dụng chủ yếu trong vòng lặp hoặc câu lệnh switch
, để thoát khỏi toàn bộ khối lệnh.
break
sẽ thoát khỏi vòng lặp hiện tại và tiếp tục thực hiện các câu lệnh sau vòng lặp.
Ví dụ
public class BreakDemo {
public static void main(String args[]) {
int[] numbers = { 10, 20, 30, 40, 50 };
for (int x : numbers) {
if (x == 30) {
break;
}
System.out.print(x);
System.out.print("\n");
}
System.out.println("Kết thúc ví dụ về break");
}
}
// output:
// 10
// 20
// Kết thúc ví dụ về break
Từ khóa continue
continue
được sử dụng trong bất kỳ cấu trúc lặp nào. Nó cho phép chương trình nhảy ngay lập tức đến lần lặp tiếp theo.
Ví dụ
public class ContinueDemo {
public static void main(String args[]) {
int[] numbers = { 10, 20, 30, 40, 50 };
for (int x : numbers) {
if (x == 30) {
continue;
}
System.out.print(x);
System.out.print("\n");
}
}
}
// output:
// 10
// 20
// 40
// 50
Từ khóa return
return
dùng để thoát khỏi toàn bộ khối lệnh của một phương thức. Các câu lệnh sau return
trong phương thức sẽ không được thực thi.
Ví dụ
public class ReturnDemo {
public static void main(String args[]) {
int[] numbers = { 10, 20, 30, 40, 50 };
for (int x : numbers) {
if (x == 30) {
return;
}
System.out.print(x);
System.out.print("\n");
}
System.out.println("Kết thúc ví dụ về return");
}
}
// output:
// 10
// 20
🔔 Lưu ý: Hãy lưu ý sự khác biệt giữa
return
vàbreak
.
Thực hành
- Trong trường hợp có nhiều lựa chọn, câu lệnh
switch
tốt hơn câu lệnhif…else if…else
. - Đừng ngần ngại sử dụng
default
trong câu lệnhswitch
. - Đặt câu lệnh
default
cuối cùng trong câu lệnhswitch
. - Uu tiên vòng lặp
foreach
hơn vòng lặpfor
truyền thống. - Không lặp qua các phần tử của một collection và xóa các phần tử cụ thể. Cách đúng là lặp qua iterator của collection và xóa phần tử.