Câu hỏi Phạm vi của biến trong trường hợp chuyển đổi [trùng lặp]


Câu hỏi này đã có câu trả lời ở đây:

Tôi nghĩ rằng tôi không hiểu làm thế nào phạm vi hoạt động trong một trường hợp chuyển đổi.

Ai đó có thể giải thích cho tôi tại sao mã đầu tiên không biên dịch nhưng mã thứ hai không?

Mã 1:

 int key = 2;
 switch (key) {
 case 1:
      String str = "1";
      return str;
 case 2:
      String str = "2"; // duplicate declaration of "str" according to Eclipse.
      return str;
 }

Mã 2:

 int key = 2;
 if (key == 1) {
      String str = "1";
      return str;
 } else if (key == 2) {
      String str = "2";
      return str;
 }

Làm thế nào đến phạm vi của biến "str" ​​không được chứa trong trường hợp 1?

Nếu tôi bỏ qua khai báo trường hợp 1 biến "str" ​​không bao giờ được khai báo ...


76
2017-10-08 20:36


gốc




Các câu trả lời:


Tôi sẽ lặp lại những gì người khác đã nói: phạm vi của các biến trong mỗi case mệnh đề tương ứng với toàn bộ switch tuyên bố. Tuy nhiên, bạn có thể tạo thêm các phạm vi lồng nhau với các dấu ngoặc như sau:

int key = 2;
switch (key) {
case 1: {
    String str = "1";
    return str;
  }
case 2: {
    String str = "2";
    return str;
  }
}

Mã kết quả bây giờ sẽ biên dịch thành công vì biến có tên str trong mỗi case mệnh đề nằm trong phạm vi riêng của nó.


140
2017-10-08 20:49



Lắng nghe anh chàng này. Anh ấy đúng. - John
Chính xác. Nhưng tôi sẽ rất khó chịu với bất kỳ lập trình viên nào trong nhóm của tôi, người sử dụng "cú pháp" này mà không có lý do RẤT tốt. Đó là một công thức cho sự nhầm lẫn và lỗi. Nó trực quan che giấu một thực tế là khối trường hợp đầu tiên (nếu nó không được cho return) "tiếp tục" ngay cả sau khi kết thúc cú đúp - và giúp quên break. - leonbloy
cũng: sử dụng break để bảo trì và phòng ngừa lỗi! ngay cả khi không bắt buộc. - worenga
@mightyuhu phá vỡ sẽ không hoạt động như có tuyên bố trở lại ... ít nhất là cho Java ... C hoặc C ++ nó là tốt ... - Boy
@Boy bạn có lẽ đúng. Tuy nhiên, đây không phải là điểm gốc của tôi. tôi nghĩ rằng những trở về sớm dẫn đến tất cả các loại bảo trì và lỗi giả mạo vấn đề không đề cập đến mã chết hoặc phức tạp cyclomatic. Vì vậy, như một lời khuyên chung nên tránh các cấu trúc như vậy ít nhất trong các trường hợp không phải là tầm thường - worenga


Phạm vi của biến là toàn bộ switch tuyên bố - tất cả các trường hợp và mặc định, nếu được bao gồm.

Dưới đây là một số tùy chọn khác ...

Lựa chọn 1:

int key = 2;
switch (key) {
case 1:
     return "1";
case 2:
     return "2";
}

Lựa chọn 2:

int key = 2;
String str = null;
switch (key) {
case 1:
     str = "1";
     return str;
case 2:
     str = "2";
     return str;
}

9
2017-10-08 20:40





Bạn dường như giả định rằng mỗi case là một khối có phạm vi địa phương riêng, như thể khối khác. Nó không phải.

Điều quan trọng là phải sửa sai lầm khái niệm này, bởi vì nếu không bạn sẽ kết thúc rơi vào cái bẫy thường xuyên quên mất break bên trong case


8
2017-10-08 20:43





Tôi nghĩ rằng đó là một câu hỏi hợp lệ, và giả định phạm vi cho trường hợp statment là không thể tránh khỏi. Điều chỉnh bản thân nó bởi vì nhà văn java đã làm điều này không chính xác.

ví dụ. nếu tuyên bố theo mặc định có dòng đầu tiên trong phạm vi của nó hơn là những gì sai với trường hợp kết thúc của vụ án được đóng một cách rõ ràng bằng tuyên bố phá vỡ. Do đó khai báo trong trường hợp 1: không nên có sẵn trong trường hợp 2 và nó có phạm vi song song nhưng không lồng nhau.


2
2017-12-14 10:55





Một số trường hợp có thể được thực thi trong một câu lệnh switch. Vì thế..


0
2017-10-08 20:40





Phạm vi của một biến tồn tại giữa các niềng răng của công tắc và nếu các câu lệnh. Trong ví dụ Mã 1, các dấu ngoặc chuyển đổi kèm theo cả hai khai báo của các biến sẽ làm cho trình biên dịch bị lỗi vì tên của biến liên kết sẽ được thực hiện.

Trong ví dụ khác, nó là ok vì cả hai biến được khai báo bên trong các dấu ngoặc nhọn của chúng.


0
2017-10-08 20:41





Trong trường hợp đầu tiên, phạm vi của khai báo String nằm trong câu lệnh switch do đó nó được hiển thị là trùng lặp trong khi chuỗi thứ hai được đặt trong các dấu ngoặc nhọn, giới hạn phạm vi trong các điều kiện if / else, do đó nó không phải là lỗi trường hợp thứ hai.


0
2017-10-08 20:43