Mục lục
Thật không may là Java không hỗ trợ lệnh goto, mặc dù vậy nó vẫn được xem là một reserved keyword trong Java.
Note: Reserved keyword được dùng trong những cú pháp của một ngôn ngữ, chúng không thể dùng để định danh cho các biến, method, label etc. Ví dụ static là một Reserved keyword dùng để khai biến static trong Java.
Không giống như C/C++, Java không hỗ trợ lệnh goto nhưng java hỗ trợ label. Nơi duy nhất mà label có thể hữu dụng là ngay trước vòng lặp lồng nhau. Label có thể sử dụng với lệnh break để thoát ra vòng lặp bên ngoài hoặc sử dụng với continue để chuyển qua lần lặp tiếp theo của vòng lặp bên ngoài.
Sử dụng label với break
class Main { public static void main(String[] args) { // creating a My HashTable Dictionary // label for outer loop outer: for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { if (j == 1) break outer; System.out.println(" value of j = " + j); } } // end of outer loop } // end of main() }
Output
value of j = 0
Sử dụng label với continue
// file name: Main.java public class Main { public static void main(String[] args) { // label for outer loop outer: for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { if (j == 1) continue outer; System.out.println(" value of j = " + j); } } // end of outer loop } // end of main() } // end of class Main
Output
value of j = 0 value of j = 0 value of j = 0 value of j = 0 value of j = 0 value of j = 0 value of j = 0 value of j = 0 value of j = 0 value of j = 0
Như đã nói ở trên thì label dùng với continue sẽ giúp chúng ta chuyển sang lần lặp tiếp theo của vòng lặp bên ngoài
for (int i = 0; i < 10; i++) { }
Nên kết quả in ra 10 lần. Nhưng đối với label hàm ý là dừng vòng lặp bên ngoài thế nên chúng ta có kết quả chỉ 1 dòng in ra màn hình.
Tại sao Java không hỗ trợ lệnh goto
Java không hỗ trợ lệnh goto vì nó cung cấp một cơ chế rẻ nhánh tuỳ ý không kiểm soát. Khiến cho mã nguồn trở nên khó hiểu và rất khó để bảo trì nâng cấp. Ngoài ra nó cũng khiến trình biên dịch khó tối ưu hơn. Tuy nhiên thì trong một số trường hợp thì goto vẫn có tác dụng nhất định ví dụ sử dụng goto để thoát ra khỏi vòng lặp lồng nhiều cấp. Để giải quyết vấn đề này chúng ta có thể sử dụng break + label.
Ví dụ 1:
public class Label_Break1 { public static void main(String[] args) { boolean t = true; first : { second : { third : { System.out.println("Before the break"); if (t) // break out of second block break second; } System.out.println("This won't execute"); } System.out.println("This is after the second block"); } } }
Output
Before the break This is after the second block
Ví dụ 2:
public class Label_Break2 { public static void main(String[] args) { outer: for (int i = 0; i < 3; i++) // label { System.out.print("Pass " + i + ": "); for (int j = 0; j < 100; j++) { if (j == 10) { break outer; // Exit both loops } System.out.print(j + " "); } System.out.println("This will not be printed"); } System.out.println("Loops Complete."); } }
Output
Pass 0: 0 1 2 3 4 5 6 7 8 9 Loops Complete.
Tóm lược
Như vậy là chúng ta đã biết rằng Java không hỗ trợ lệnh goto nhưng thay vào đó Java đã cung cấp 1 số cơ chế cho phép xử lý các tình huống mà goto thường được sử dụng để giải quyết trong các ngôn ngữ khác như C/C++. Mình cũng khá bất ngờ khi tìm hiểu về vấn đề này vì thú thật rằng code Java tầm 2 năm nhưng chưa từng sử dụng lệnh goto.
Nguồn tham khảo