2015-02-26 13 views
6

Mã java sau thực hiện mà không có lỗi trong Java 1,7Cách khai báo phạm vi java trong câu lệnh case switch?

public static void main(String[] args) { 
    int x = 5; 

    switch(x) { 
     case 4: 
      int y = 3423432; 
      break; 
     case 5: { 
      y = 33; 
     } 
    } 
} 

như thế nào java hình ra y đó là một int kể từ khi tuyên bố không bao giờ được chạy. Liệu việc khai báo các biến trong một câu lệnh case có được phạm vi đến mức câu lệnh switch khi các dấu ngoặc không được sử dụng trong một câu lệnh case?

+0

Tôi tin rằng biến được khai báo trong phạm vi toàn bộ chuyển đổi và không chỉ là trường hợp. Tôi không chắc chắn về nó nhưng tôi nghĩ đó là những gì đang xảy ra. – StackFlowed

+1

câu hỏi tương tự cũng được đưa ra trước đây: http://stackoverflow.com/questions/10810768/declaring-and-initializing-variables-within-java-switches – DonatasD

+1

hy vọng liên kết này sẽ trả lời cho câu hỏi của bạn http://stackoverflow.com/questions/3894119/variables-scope-in-a-switch-case –

Trả lời

9

Tuyên bố không "chạy" - chúng không phải là thứ cần thực thi, chúng chỉ cho trình biên dịch biết loại biến. (Một initializer sẽ chạy, nhưng đó là tốt - bạn không cố gắng để đọc từ biến trước khi gán một giá trị cho nó.)

phạm trù trong báo cáo chuyển đổi chắc chắn là kỳ quặc, nhưng về cơ bản biến khai báo trong case đầu tiên là vẫn nằm trong phạm vi số case thứ hai.

Từ section 6.3 of the JLS:

Phạm vi của một khai báo biến cục bộ trong một khối (§14.4) là phần còn lại của khối, trong đó khai báo xuất hiện, bắt đầu với initializer riêng của mình và bao gồm bất kỳ declarators hơn nữa để quyền trong tuyên bố khai báo biến cục bộ.

Trừ khi bạn tạo thêm khối, toàn bộ lệnh chuyển đổi là một khối. Nếu bạn muốn một phạm vi mới cho từng trường hợp, bạn có thể sử dụng dấu ngoặc ôm:

case 1: { 
    int y = 7; 
    ... 
} 
case 2: { 
    int y = 5; 
    ... 
} 
1

trường hợp chính nó không khai báo phạm vi. Phạm vi bị giới hạn bởi {}. Vì vậy, biến số y của bạn được xác định trong phạm vi ngoài (của toàn bộ công tắc) và được cập nhật trong phạm vi bên trong (của case 5).

0

Như tôi biết là một câu lệnh chuyển đổi hoàn chỉnh một phạm vi. Không nghỉ ngơi; hoặc trả lại; tuyên bố các trường hợp chuyển đổi khác cũng sẽ được diễn giải. Vì vậy, khi bạn xác định một biến bên trong câu lệnh switch, nó sẽ hiển thị trong trường hợp chuyển lỗ.

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