Saya punya pertanyaan gila tentang sakelar Java.
int key = 2;
switch (key) {
case 1:
int value = 1;
break;
case 2:
value = 2;
System.out.println(value);
break;
default:
break;
}
Skenario 1 - Ketika key
keduanya berhasil mencetak nilai sebagai 2.
Skenario 2 - Ketika saya akan berkomentar value = 2
di case 2:
dalamnya bertengkar mengatakan nilai variabel lokal mungkin belum diinisialisasi .
Pertanyaan:
Skenario 1: Jika aliran eksekusi tidak berjalan ke case 1:
(ketika key = 2
), lalu bagaimana cara mengetahui jenis variabel nilai int
?
Skenario 2: Jika kompilator mengetahui tipe variabel nilai sebagai int
, maka ia harus mengakses int value = 1;
ekspresi in case 1:
. (Deklarasi dan Inisialisasi). Lalu mengapa hal itu sqawrk Ketika aku akan berkomentar value = 2
di case 2:
, mengatakan nilai variabel lokal mungkin tidak telah diinisialisasi .
java
scope
initialization
switch-statement
declaration
namalfernandolk.dll
sumber
sumber
Jawaban:
Pernyataan switch ganjil dalam hal pelingkupan, pada dasarnya. Dari bagian 6.3 JLS :
Dalam kasus Anda,
case 2
berada di blok yang sama dengancase 1
dan muncul setelahnya, meskipuncase 1
tidak akan pernah dieksekusi ... jadi variabel lokal ada dalam cakupan dan tersedia untuk ditulis meskipun Anda secara logis tidak pernah "menjalankan" deklarasi. (Deklarasi tidak benar-benar "dapat dieksekusi" meskipun inisialisasi adalah.)Jika Anda mengomentari
value = 2;
tugas, kompilator masih tahu variabel mana yang Anda rujuk, tetapi Anda tidak akan melalui jalur eksekusi apa pun yang memberinya nilai, itulah sebabnya Anda mendapatkan kesalahan seperti yang Anda lakukan ketika mencoba membaca variabel lokal lain yang tidak ditetapkan secara pasti.Saya sangat menyarankan Anda untuk tidak menggunakan variabel lokal yang dideklarasikan dalam kasus lain - ini mengarah ke kode yang sangat membingungkan, seperti yang Anda lihat. Ketika saya memperkenalkan variabel lokal dalam pernyataan switch (yang jarang saya coba lakukan - case harus sangat pendek, idealnya) saya biasanya lebih suka memperkenalkan ruang lingkup baru:
Saya yakin ini lebih jelas.
sumber
Variabel telah dideklarasikan (sebagai int), tetapi tidak diinisialisasi (diberi nilai awal). Pikirkan barisnya:
Sebagai:
Bagian tersebut
int value
memberi tahu kompilator pada waktu kompilasi bahwa Anda memiliki variabel bernama nilai yang merupakan int. Bagian inivalue = 1
menginisialisasinya, tetapi itu terjadi pada waktu proses, dan tidak terjadi sama sekali jika cabang sakelar itu tidak dimasukkan.sumber
Dari http://www.coderanch.com/t/447381/java-programmer-SCJP/certification/variable-initialization-within-case-block
sumber
Dengan integrasi JEP 325: Switch Expressions (Preview) di JDK-12 akses awal build. Ada beberapa perubahan yang bisa dilihat dari jawaban Jon -
Lingkup Variabel Lokal - Variabel lokal dalam kasus sakelar sekarang dapat menjadi lokal untuk kasing itu sendiri alih-alih seluruh blok sakelar . Contoh (mirip dengan apa yang Jon telah coba secara sintaksis juga) mempertimbangkan
Day
kelas enum untuk penjelasan lebih lanjut:Tukar Ekspresi - Jika tujuannya adalah untuk menetapkan nilai ke variabel dan kemudian menggunakannya, sekali saja dapat menggunakan ekspresi sakelar. misalnya
sumber
Penjelasan ini mungkin bisa membantu.
sumber
Spesifikasi Java:
https://docs.oracle.com/javase/specs/jls/se12/html/jls-14.html#jls-14.11
https://docs.oracle.com/javase/specs/jls/se12/html/jls-14.html#jls-14.7
Pernyataan berlabel:
Dengan kata lain, kasus 1, kasus 2 adalah label di dalam pernyataan sakelar. pernyataan istirahat dan lanjutkan dapat diterapkan ke label.
Karena label berbagi ruang lingkup pernyataan, semua variabel yang ditentukan dalam label berbagi ruang lingkup pernyataan sakelar.
sumber