2010-06-17 29 views
7

Trước sự ngạc nhiên của tôi mã này hoạt động tốt:Khi nào các tham chiếu được khai báo trong câu lệnh chuyển đổi?

int i = 2; 
switch(i) { 
case 1: 
    String myString = "foo"; 
    break; 
case 2: 
    myString = "poo"; 
    System.out.println(myString); 
} 

Nhưng tài liệu tham khảo Chuỗi không bao giờ được công bố? Nó có thể là tất cả các biến trong mọi trường hợp luôn luôn được khai báo không có vấn đề gì, hoặc làm thế nào là điều này giải quyết?

+1

Không phải tất cả các khai báo được thực hiện ở đầu khối {...} chứa chúng? –

+0

Tôi nghĩ Jules là đúng. Java có các phạm vi tĩnh nên luồng điều khiển không ảnh hưởng đến việc tạo (thay vì khởi tạo) của biến. Vị trí trên ngăn xếp được phân bổ khi nhập khối chuyển đổi. Nhưng nó vẫn là loại curios. GCC từ chối biên dịch mã C tương đương cho (tôi nghĩ) cùng một lý do Java từ chối biên dịch 'if (someBool) String s =" foo ";' – musiKk

Trả lời

7

Vâng, đó là về dấu ngoặc (tức là phạm vi).

Đó là thực hành tốt hơn, cho là, để viết báo cáo của bạn như vậy:

int i = 2; 
switch(i) { 
    case 1: { 
     String myString = "foo"; 
     break; 
    } 
    case 2: { 
     myString = "poo"; 
     System.out.println(myString); 
    } 
} 

(Tôi không gần một trình biên dịch Java ngay bây giờ, nhưng điều đó không nên biên dịch).

+0

Tôi đã học được điều gì đó mới mẻ ngay hôm nay! –

+2

Thực tế nó không biên dịch. – musiKk

+0

@musikk: Cảm ơn bạn đã xác nhận, không phải lúc nào tôi cũng vui vì có gì đó không biên dịch :) –

3

Phạm vi của khai báo myString là khối chuyển đổi (trong đó {ký tự là). Nếu bạn viết nó như thế này, tờ khai sẽ là một trường hợp:

int i = 2; 
switch(i) { 
    case 1: { 
     String myString = "foo"; 
     break; 
    } 

    case 2: { 
     String myString = "poo"; 
     System.out.println(myString); 
    } 
} 
Các vấn đề liên quan