Di Java, permulaan pembolehubah yang betul adalah penting untuk kefungsian kod. Artikel ini meneroka perlakuan yang berbeza bagi pembolehubah tempatan yang tidak dimulakan dan ahli contoh.
Pertimbangkan coretan kod berikut:
<code class="java">public class TestClass { private String a; private String b; public TestClass() { a = "initialized"; } public void doSomething() { String c; a.notify(); // This is fine b.notify(); // This will throw a runtime exception c.notify(); // Compile-time error: "Local variable c may not have been initialized" } }</code>
Kekeliruan timbul daripada fakta bahawa kedua-dua b dan c tidak dimulakan. Walau bagaimanapun, b tidak menimbulkan ralat masa kompilasi seperti yang dilakukan c. Mengapakah percanggahan itu?
Ahli Contoh (Medan)
Java memulakan pembolehubah contoh jenis objek kepada null secara lalai. Walaupun b tidak dimulakan secara eksplisit, ia menunjuk kepada null. Ini kerana medan diperuntukkan apabila objek dibuat, dan null ialah nilai yang sah untuk jenis rujukan. Oleh itu, b.notify() boleh dipanggil tanpa menghadapi ralat.
Pembolehubah Setempat
Sebaliknya, pembolehubah tempatan tidak dimulakan secara automatik. Mereka kekal tidak dimulakan sehingga diberikan nilai secara eksplisit. Percubaan untuk mengakses pembolehubah tempatan yang tidak dimulakan menghasilkan ralat masa kompilasi. Ini jelas dalam kes c, yang tidak diberikan nilai sebelum ia digunakan.
Spesifikasi Bahasa
Spesifikasi Bahasa Java (JLS) mentakrifkan peraturan ini dalam Bahagian 4.12.5:
Pembolehubah contoh jenis kelas (rujukan objek) dimulakan kepada null nilai khas secara lalai.
Pembolehubah tempatan jenis kelas (objek rujukan) tidak dimulakan secara lalai dan ia adalah ralat masa kompilasi jika program cuba mengakses satu yang belum dimulakan.
Atas ialah kandungan terperinci Mengapa Beberapa Pembolehubah Tidak Dimulakan Boleh Disusun Sementara Yang Lain Menyebabkan Ralat di Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!