1. Ứng dụng của continue và break trong câu lệnh switch kết hợp với vòng lặp for
Trong lập trình Java, các từ khóa continue và break là những công cụ mạnh mẽ để điều khiển luồng thực thi bên trong các vòng lặp. Khi được sử dụng trong một câu lệnh switch nằm trong một vòng lặp for, chúng có những tác động khác nhau đến quá trình lặp. Hãy xem xét ví dụ sau để hiểu rõ hơn về cách chúng hoạt động:
public class LoopControlExamples {
public static void main(String[] args) {
int accumulatedSum = 0;
System.out.println("--- Bắt đầu minh họa continue/break trong switch và for ---");
for (int iterationCount = 1; iterationCount < 5; iterationCount++) {
System.out.println("\n> Khởi đầu vòng lặp for thứ: " + iterationCount + ", Tổng hiện tại: " + accumulatedSum);
switch (iterationCount) {
case 1:
accumulatedSum += 2;
// Fall-through to case 2 as there's no break
case 2:
accumulatedSum += 4;
System.out.println(" [Case " + iterationCount + "] Gặp LỆNH CONTINUE. Thoát khỏi switch và bỏ qua phần còn lại của VÒNG LẶP FOR hiện tại.");
System.out.println(" Tổng sau khi gặp continue: " + accumulatedSum);
continue; // Chuyển sang lần lặp tiếp theo của vòng for
case 3:
accumulatedSum += 16;
System.out.println(" [Case " + iterationCount + "] Gặp LỆNH BREAK. Thoát khỏi switch, nhưng TIẾP TỤC thực thi trong vòng lặp for.");
System.out.println(" Tổng sau khi gặp break: " + accumulatedSum);
break; // Thoát khỏi switch, tiếp tục thực thi các lệnh sau switch trong vòng for
default:
accumulatedSum += 4;
System.out.println(" [Case Mặc định] Không khớp case nào. Tổng: " + accumulatedSum);
// Không có break/continue ở đây, sẽ tiếp tục thực thi sau switch
}
System.out.println(" <-- ĐANG TIẾP TỤC thực thi CÁC LỆNH CÒN LẠI trong vòng for (chỉ hiển thị khi có break hoặc default) -->");
}
System.out.println("\n--- Vòng lặp for đã kết thúc. Tổng cuối cùng: " + accumulatedSum + " ---");
}
}
Giải thích luồng thực thi:
-
Khi
iterationCountlà 1:accumulatedSumtrở thành 2 (từ case 1), sau đó 6 (từ case 2 do fall-through).- Gặp
continuetrongcase 2. Lệnh này ngay lập tức kết thúc lần lặp hiện tại của vòngfor(tức là không chạy dòng "ĐANG TIẾP TỤC thực thi..." bên dướiswitch) và chuyển sang lần lặp tiếp theo củafor. iterationCounttăng lên 2.
-
Khi
iterationCountlà 2:accumulatedSumtrở thành 10 (6 + 4 từ case 2).- Gặp
continuetrongcase 2. Tương tự như trên, vòngfornhảy sang lần lặp kế tiếp. iterationCounttăng lên 3.
-
Khi
iterationCountlà 3:accumulatedSumtrở thành 26 (10 + 16 từ case 3).- Gặp
breaktrongcase 3. Lệnh này chỉ thoát khỏi khốiswitch. Chương trình sau đó tiếp tục thực thi các lệnh ngay sauswitchbên trong vòngfor. - Dòng "ĐANG TIẾP TỤC thực thi..." được hiển thị.
- Vòng
forhoàn tất lần lặp này vàiterationCounttăng lên 4.
-
Khi
iterationCountlà 4:- Không khớp với
case 1,2, hay3, nên chạy khốidefault. accumulatedSumtrở thành 30 (26 + 4 từ default).- Không có
breakhaycontinuetrongdefault, nên thực thi các lệnh sauswitch. - Dòng "ĐANG TIẾP TỤC thực thi..." được hiển thị.
- Vòng
forhoàn tất lần lặp này vàiterationCounttăng lên 5.
- Không khớp với
- Vòng
forkết thúc vìiterationCountkhông còn nhỏ hơn 5. Tổng cuối cùng là 30.
Điều quan trọng cần nhớ là continue sẽ bỏ qua phần còn lại của lần lặp vòng lặp chứa nó, trong khi break chỉ thoát khỏi khối switch hoặc vòng lặp chứa nó (nếu không có switch).
2. Sử dụng nhãn (Labels) với break và continue trong Java
Mặc dù Java không có câu lệnh goto theo nghĩa truyền thống như C/C++, nó cung cấp cơ chế nhãn (labels) để điều khiển luồng của các câu lệnh break và continue trong các vòng lặp lồng nhau. Điều này cho phép chúng ta thoát hoặc bỏ qua các lần lặp của một vòng lặp bên ngoài từ bên trong một vòng lặp lồng sâu hơn.
public class LabeledLoopControl {
public static void main(String[] args) {
System.out.println("--- Bắt đầu minh họa Labeled Loop Control trong Java ---");
int innerLoopVariable = 0;
outerLoop: // Định nghĩa nhãn cho vòng lặp ngoài
for (int outerLoopVariable = 0; ; outerLoopVariable++) { // Vòng lặp ngoài vô hạn
System.out.println("\n> Bắt đầu VÒNG LẶP NGOÀI, lượt: " + outerLoopVariable);
innerLoop: // Định nghĩa nhãn cho vòng lặp trong
for (; innerLoopVariable < 10; innerLoopVariable++) { // Vòng lặp trong, điều khiển bởi innerLoopVariable
System.out.println(" > Vòng lặp trong: outer=" + outerLoopVariable + ", inner=" + innerLoopVariable);
if (innerLoopVariable == 2) {
System.out.println(" [inner=" + innerLoopVariable + "] Gặp CONTINUE (không nhãn). Bỏ qua phần còn lại của vòng lặp trong hiện tại.");
continue; // Chỉ bỏ qua phần còn lại của 'innerLoop'
}
if (innerLoopVariable == 3) {
innerLoopVariable++; // Tăng biến trước khi break để khớp logic gốc và đầu ra
System.out.println(" [inner=" + (innerLoopVariable -1) + "] Gặp BREAK (không nhãn). Thoát khỏi vòng lặp trong.");
break; // Thoát khỏi 'innerLoop', tiếp tục 'outerLoop'
}
// Vòng lặp thứ ba lồng sâu hơn để minh họa 'continue innerLoop'
for (int deepestLoopVariable = 0; deepestLoopVariable < 5; deepestLoopVariable++) {
if (deepestLoopVariable == 3) {
System.out.println(" [deep=" + deepestLoopVariable + "] Gặp CONTINUE innerLoop. Nhảy tới lần lặp TIẾP THEO của vòng lặp trong.");
continue innerLoop; // Nhảy tới lần lặp tiếp theo của vòng 'innerLoop'
}
}
if (innerLoopVariable == 7) {
innerLoopVariable++; // Tăng biến trước khi continue để khớp logic gốc và đầu ra
System.out.println(" [inner=" + (innerLoopVariable -1) + "] Gặp CONTINUE outerLoop. Nhảy tới lần lặp TIẾP THEO của vòng lặp ngoài.");
continue outerLoop; // Nhảy tới lần lặp tiếp theo của vòng 'outerLoop'
}
if (innerLoopVariable == 8) {
System.out.println(" [inner=" + innerLoopVariable + "] Gặp BREAK outerLoop. THOÁT HOÀN TOÀN khỏi vòng lặp ngoài.");
break outerLoop; // Thoát hoàn toàn khỏi 'outerLoop'
}
System.out.println(" <-- Tiếp tục thực thi trong vòng lặp trong (sau vòng lặp sâu nhất) -->");
}
System.out.println("Kết thúc vòng lặp trong. Đang TIẾP TỤC thực thi trong vòng lặp ngoài: " + outerLoopVariable);
}
System.out.println("\n--- Tất cả các vòng lặp đã kết thúc ---");
}
}
Giải thích luồng thực thi với nhãn:
-
outerLoop: for (...)vàinnerLoop: for (...): Đây là cách định nghĩa nhãn. Nhãn được đặt ngay trước câu lệnh vòng lặp mà nó áp dụng. -
if (innerLoopVariable == 2) { continue; }:- Khi
innerLoopVariablelà 2, lệnhcontinuenày chỉ bỏ qua phần còn lại của lần lặp hiện tại của vònginnerLoop. innerLoopVariabletăng lên 3, và vònginnerLooptiếp tục với lần lặp mới.
- Khi
-
if (innerLoopVariable == 3) { innerLoopVariable++; break; }:- Khi
innerLoopVariablelà 3, lệnhbreaknày thoát khỏi vònginnerLoop. - Chương trình tiếp tục thực thi các lệnh ngay sau
innerLoop, tức là in ra "Kết thúc vòng lặp trong..." và sau đóouterLoopVariabletăng lên.
- Khi
-
if (deepestLoopVariable == 3) { continue innerLoop; }:- Khi
deepestLoopVariablelà 3, lệnhcontinue innerLoopsẽ bỏ qua phần còn lại của lần lặp hiện tại của vònginnerLoop(và cảdeepestLoop), đồng thời nhảy đến lần lặp tiếp theo củainnerLoop. - Điều này có nghĩa là mọi lệnh sau khối
deepestLooptrong lần lặp hiện tại củainnerLoopsẽ bị bỏ qua.
- Khi
-
if (innerLoopVariable == 7) { innerLoopVariable++; continue outerLoop; }:- Khi
innerLoopVariablelà 7, lệnhcontinue outerLoopsẽ bỏ qua phần còn lại của lần lặp hiện tại của vòngouterLoopvà nhảy đến lần lặp tiếp theo củaouterLoop. - Lưu ý rằng
innerLoopVariableđược tăng lên trước khicontinue outerLoopđể đảm bảo vòng lặp ngoài tiến triển và tránh lặp vô hạn với cùng giá trịinnerLoopVariable.
- Khi
-
if (innerLoopVariable == 8) { break outerLoop; }:- Khi
innerLoopVariablelà 8, lệnhbreak outerLoopsẽ thoát hoàn toàn khỏi vòngouterLoop(và tất cả các vòng lặp lồng bên trong nó). - Chương trình chuyển đến câu lệnh ngay sau toàn bộ khối
outerLoop.
- Khi
Việc sử dụng nhãn là cần thiết trong Java khi bạn cần thoát hoặc bỏ qua các lần lặp của một vòng lặp bên ngoài từ một vòng lặp lồng sâu hơn. Nếu không có nhãn, break và continue mặc định chỉ tác động đến vòng lặp gần nhất.