Pertanyaan Lingkup Variabel dalam sakelar [duplikat]


Pertanyaan ini sudah memiliki jawaban di sini:

Saya pikir saya tidak mengerti bagaimana ruang lingkup bekerja dalam kasus switch.

Dapatkah seseorang menjelaskan kepada saya mengapa kode pertama tidak dikompilasi tetapi yang kedua tidak?

Kode 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;
 }

Kode 2:

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

Bagaimana bisa lingkup variabel "str" ​​tidak terkandung dalam Kasus 1?

Jika saya melewatkan deklarasi kasus 1, variabel "str" ​​tidak pernah dinyatakan ...


76
2017-10-08 20:36


asal


Jawaban:


Saya akan mengulangi apa yang dikatakan orang lain: ruang lingkup variabel di masing-masing case klausa sesuai dengan keseluruhan switch pernyataan. Namun, Anda dapat membuat cakupan bersarang lebih lanjut dengan tanda kurung sebagai berikut:

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

Kode yang dihasilkan sekarang akan berhasil dikompilasi sejak variabel bernama str di setiap case klausa ada di ruang lingkupnya sendiri.


140
2017-10-08 20:49



Ruang lingkup variabel adalah keseluruhan switch pernyataan - semua kasus dan default, jika disertakan.

Berikut beberapa opsi lain ...

Pilihan 1:

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

Pilihan 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



Anda tampaknya berasumsi bahwa masing-masing case adalah blok dengan cakupan lokalnya sendiri, seolah-olah blok / lainnya. Ini bukan.

Sangat penting untuk memperbaiki kesalahan konsep ini, karena jika tidak, Anda akan berakhir jatuh dalam perangkap sering melupakan break di dalam case


8
2017-10-08 20:43



Saya pikir itu pertanyaan yang valid, dan cakupan asumsi untuk pernyataan kasus tidak dapat dihindari. Menyesuaikan diri untuk itu karena penulis java telah membuat ini tidak benar.

misalnya jika pernyataan secara default mengambil garis pertama dalam ruang lingkupnya daripada apa yang salah dengan kasus di mana akhir kasus secara eksplisit ditutup oleh pernyataan istirahat. Oleh karena itu deklarasi dalam kasus 1: seharusnya tidak tersedia dalam kasus 2 dan memiliki ruang lingkup paralel tetapi tidak bersarang.


2
2017-12-14 10:55



Beberapa kasus dapat dieksekusi dalam satu pernyataan switch. Begitu..


0
2017-10-08 20:40



Ruang lingkup suatu variabel ada di antara tanda pengikat dan pernyataan. Dalam contoh Kode 1, tanda kurung tutup melampirkan kedua deklarasi variabel yang akan menyebabkan kompilator menjadi kesalahan karena nama untuk pengikatan variabel telah dibuat.

Dalam contoh lain itu ok karena kedua variabel dideklarasikan dalam kurung mereka sendiri (ruang lingkup).


0
2017-10-08 20:41



Dalam kasus pertama ruang lingkup deklarasi String adalah dalam pernyataan saklar karena itu ditampilkan sebagai duplikat sementara di kedua string dilampirkan dalam kurung kurawal yang membatasi ruang lingkup dalam kondisi if / else, oleh karena itu tidak ada kesalahan dalam kasus kedua.


0
2017-10-08 20:43