Java có hỗ trợ lệnh goto giống như C/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

https://www.geeksforgeeks.org/g-fact-64/

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x