2015-06-03 11 views
8

Nếu chúng ta nhìn vào Java standard §14.7, chúng ta thấy rằng báo cáo chưa có tiền tố nhãn, ví dụ:Java nhãn bất thường (? Có thể bug)

LabeledStatement:

Định danh: Báo cáo

Theo lý thuyết, nhãn có thể gắn nhãn bất kỳ câu lệnh thành công nào. Vì vậy, ví dụ, sau đây biên dịch cho phù hợp:

public class Test { 
    public static void main(String[] args) { 
    hello: 
     return; 
    } 

} 

trực giác, điều này cũng biên dịch:

public class Test { 
    int i; 
    public static void main(String[] args) { 
     Test t = new Test(); 
    label: 
     t.i = 2;   
    } 
} 

Nhưng sau không không biên dịch:

public class Test { 
    public static void main(String[] args) { 
    oops: 
     int k = 3; 
    } 
} 

Mặc dù đây không (lưu ý các dấu ngoặc nhọn):

public class Test { 
    public static void main(String[] args) { 
    oops: 
     { 
      int k = 3; 
     } 
    } 
} 

Vì vậy, câu hỏi xoay quanh việc có khai báo hay không. Theo tiêu chuẩn (và online documentation):

Ngoài tuyên bố biểu thức, còn có hai loại câu lệnh khác: tuyên bố khai báo và lưu lượng điều khiển. Một tuyên bố khai báo khai báo một biến.

Tôi đã nhận thấy hành vi này trong Java 7 và 8 trên cả OSX lẫn Windows. Đây có phải là lỗi hay tôi hiểu nhầm tiêu chuẩn?

+0

Thú vị. Trình biên dịch cung cấp thông báo lỗi nào? – Thilo

Trả lời

8

Khái niệm

int k = 3; 

là một local variable declaration statement.

Các statement sử dụng trong cú pháp của một tuyên bố nhãn

LabeledStatement:

Identifier: Statement

không chứa báo cáo khai báo biến cục bộ. Do đó, bạn không thể sử dụng chúng trong một tuyên bố được dán nhãn trực tiếp.

Tuyên bố khai báo biến cục bộ có thể được sử dụng trong phạm vi blocks có thể được sử dụng trong các câu lệnh được gắn nhãn.

Các vấn đề liên quan