Untuk programmer Java, null adalah hal yang memusingkan. Anda sering diganggu oleh Null Pointer Exceptions (NPE). Bahkan penemu Java pun mengakui bahwa ini adalah kesalahan besar yang dilakukannya. Mengapa Java tetap nol? Null telah ada selama beberapa waktu, dan saya pikir para penemu Java tahu bahwa null menyebabkan lebih banyak masalah daripada masalah yang diselesaikannya, tetapi null masih ada di Java.
Saya semakin terkejut, karena prinsip desain Java adalah untuk menyederhanakan, itulah sebabnya tidak ada waktu yang terbuang untuk pointer, operator yang kelebihan beban, dan implementasi pewarisan berganda Null justru sebaliknya. Ya, saya tidak begitu tahu jawaban atas pertanyaan ini, yang saya tahu adalah tidak peduli seberapa dikritiknya null oleh pengembang Java dan komunitas open source, kita harus hidup berdampingan dengan null. Daripada menyesali keberadaan null, sebaiknya kita mempelajari null dengan lebih baik dan memastikan bahwa null digunakan dengan benar.
Mengapa Anda perlu mempelajari null di Java? Karena jika Anda tidak memperhatikan null, Java akan membuat Anda menderita NullPointerException, dan Anda akan mendapat pelajaran yang menyakitkan. Pemrograman yang energik adalah seni yang akan lebih dihargai oleh tim, pelanggan, dan pengguna Anda. Menurut pengalaman saya, salah satu alasan utama pengecualian pointer nol adalah kurangnya pengetahuan tentang null di Java. Banyak dari Anda sudah familiar dengan null, namun bagi yang belum, Anda bisa mempelajari sesuatu yang lama dan baru tentang null. Mari pelajari kembali beberapa pengetahuan penting tentang null di Java.
Apa itu Null di Jawa?
Seperti yang saya katakan, null adalah konsep yang sangat penting di Java. Maksud awal dari null adalah untuk mewakili sesuatu yang hilang, seperti pengguna yang hilang, sumber daya, atau hal lainnya. Namun, setahun kemudian, pengecualian penunjuk nol yang merepotkan menyebabkan banyak gangguan terhadap pemrogram Java. Dalam materi ini, kita akan mempelajari detail dasar kata kunci null di Java, dan menjelajahi beberapa teknik untuk meminimalkan pemeriksaan null dan cara menghindari pengecualian penunjuk nol yang buruk.
1) Pertama-tama, null adalah kata kunci di Java, seperti public, static, dan final. Ini peka terhadap huruf besar-kecil, Anda tidak dapat menulis null sebagai Null atau NULL, kompiler tidak akan mengenalinya dan melaporkan kesalahan.
Copy kode kodenya sebagai berikut:
Obj objek = NULL; // Tidak Oke
Objek obj1 = null //Oke
Pemrogram yang menggunakan bahasa lain mungkin mengalami masalah ini, tetapi sekarang penggunaan IDE telah menjadikan masalah ini sepele. Sekarang, saat Anda mengetik kode, IDE seperti Eclipse dan Netbeans dapat memperbaiki kesalahan ini. Namun menggunakan alat lain seperti notepad, Vim, dan Emacs, masalah ini akan membuang-buang waktu berharga Anda.
2) Sama seperti setiap tipe primitif memiliki nilai default, misalnya, nilai default int adalah 0, nilai default boolean adalah false, dan null adalah nilai default dari semua tipe referensi dari semua jenis objek. Sama seperti Anda membuat variabel boolean yang memiliki nilai default false, variabel referensi apa pun di Java memiliki null sebagai nilai defaultnya. Hal ini berlaku untuk semua variabel, seperti variabel anggota, variabel lokal, variabel instan, variabel statis (tetapi bila Anda menggunakan variabel lokal yang tidak diinisialisasi, kompiler akan memperingatkan Anda). Untuk mendemonstrasikan fakta ini, Anda dapat mengamati variabel referensi ini dengan membuat variabel dan kemudian mencetak nilainya, seperti yang ditunjukkan pada kode berikut:
Copy kode kodenya sebagai berikut:
Objek statis pribadi myObj;
public static void main(String args[]){
System.out.println("Berapa nilai myObjc : " + myObj);
}
Berapa nilai myObjc : null
Hal ini berlaku untuk objek statis dan non-statis. Seperti yang Anda lihat di sini, saya mendefinisikan myObj sebagai referensi statis sehingga saya dapat menggunakannya langsung di metode utama. Perhatikan bahwa metode utama adalah metode statis dan tidak dapat menggunakan variabel non-statis.
3) Kami ingin mengklarifikasi beberapa kesalahpahaman. Null bukanlah sebuah objek atau tipe. Ini hanyalah nilai khusus. Anda dapat menetapkannya ke tipe referensi apa pun. Anda juga dapat mengonversi null ke tipe apa pun.
Copy kode kodenya sebagai berikut:
String str = null; // null dapat ditugaskan ke String
Integer itr = null; // Anda juga dapat menetapkan null ke Integer
Double dbl = null; // null juga dapat ditetapkan ke Double
String myStr = (String) null; // null dapat diketikkan ke String
Integer myItr = (Integer) null; // bisa juga diketikkan ke Integer
Double myDbl = (Double) null; // ya itu mungkin, tidak ada kesalahan
Anda dapat melihat bahwa casting null ke tipe referensi apa pun dimungkinkan pada waktu kompilasi dan run, dan tidak akan memunculkan pengecualian penunjuk null pada run time.
4) Null dapat ditetapkan ke variabel referensi, tetapi Anda tidak dapat menetapkan null ke variabel tipe dasar, seperti int, double, float, dan boolean. Jika Anda melakukan itu, kompiler akan memunculkan kesalahan seperti ini:
Copy kode kodenya sebagai berikut:
int i = null; // ketidakcocokan tipe : tidak dapat mengkonversi dari null ke int
short s = null; // type mismatch : tidak dapat mengkonversi dari null ke short
byte b = null: // type mismatch: tidak dapat mengkonversi dari null ke byte
double d = null; //ketidakcocokan tipe: tidak dapat mengonversi dari nol menjadi ganda
Bilangan bulat itr = null; // tidak apa-apa
int j = itr; // ini juga oke, tapi NullPointerException saat runtime
Seperti yang Anda lihat, saat Anda menetapkan null langsung ke tipe primitif, terjadi kesalahan kompilasi. Tetapi jika Anda menetapkan null ke objek kelas pembungkus, dan kemudian menetapkan objek ke tipe dasar masing-masing, kompiler tidak akan melaporkannya, tetapi Anda akan menemukan pengecualian penunjuk nol saat runtime. Hal ini disebabkan oleh unboxing otomatis di Java, yang akan kita lihat pada poin-poin berikutnya.
5) Kelas pembungkus apa pun yang berisi nilai nol akan memunculkan pengecualian penunjuk nol saat Java membuka kotak dan menghasilkan tipe data dasar. Beberapa programmer membuat kesalahan dengan berpikir bahwa autoboxing akan mengkonversi null ke nilai default dari masing-masing tipe dasar, seperti 0 untuk int dan false untuk tipe boolean, tapi itu tidak benar, seperti yang ditunjukkan di bawah ini:
Copy kode kodenya sebagai berikut:
Bilangan bulat iAmNull = nol;
int i = iAmNull; // Ingat - Tidak Ada Kesalahan Kompilasi
Namun saat Anda menjalankan cuplikan kode di atas, Anda akan melihat di konsol bahwa thread utama memunculkan pengecualian penunjuk nol. Banyak kesalahan seperti itu terjadi saat menggunakan nilai kunci HashMap dan Integer. Kesalahan akan muncul ketika Anda menjalankan kode berikut.
Copy kode kodenya sebagai berikut:
impor java.util.HashMap;
import java.util.Map;
/**
* Contoh Autoboxing dan NullPointerExcpetion
*
* @penulis WINDOWS 8
*/
Tes kelas publik {
public static void main(String args[]) melempar InterruptedException {
Nomor petaAndCount = HashMap baru<>();
int[] angka = {3, 5, 7,9, 11, 13, 17, 19, 2, 3, 5, 33, 12, 5};
untuk(int i : angka){
int hitungan = angkaAndCount.get(i);
numberAndCount.put(i, count++); // NullPointerException di sini
}
}
}
Keluaran:
Copy kode kodenya sebagai berikut:
Pengecualian di thread "utama" java.lang.NullPointerException
di Test.main(Test.java:25)
Kode ini terlihat sangat sederhana dan bebas kesalahan. Yang Anda lakukan hanyalah menemukan berapa kali suatu angka muncul dalam sebuah array, yang merupakan teknik umum untuk menemukan duplikat dalam array Java. Pengembang pertama-tama mendapatkan nilai sebelumnya, lalu menambahkan satu, dan terakhir mengembalikan nilai tersebut ke dalam Peta. Pemrogram mungkin berpikir bahwa ketika memanggil metode put, tinju otomatis akan menangani tinju int ke Interger, tetapi dia lupa bahwa ketika suatu angka tidak memiliki nilai hitungan, metode get() dari HashMap akan mengembalikan null, dan Bukan 0 , karena nilai default Integer adalah null bukan 0. Autoboxing akan mengembalikan NullPointerException ketika meneruskan nilai null ke variabel int. Bayangkan jika kode ini berada di dalam sarang if dan tidak berjalan di lingkungan QA, tetapi setelah Anda meletakkannya di lingkungan produksi, BOOM :-)
6) Jika variabel tipe referensi dengan nilai null digunakan, operasi instanceof akan mengembalikan false:
Copy kode kodenya sebagai berikut:
Bilangan bulat iAmNull = nol;
if(contoh Integer iAmNull){
System.out.println("iAmNull adalah turunan dari Integer");
}kalau tidak{
System.out.println("iAmNull BUKAN turunan dari Integer");
}
Keluaran:
Copy kode kodenya sebagai berikut:
Saya
AmNull BUKAN turunan dari Integer
Ini adalah fitur yang sangat penting dari operasi instanceof, sehingga berguna untuk pemeriksaan tipe cast.
7) Anda mungkin tahu bahwa Anda tidak dapat memanggil metode non-statis untuk menggunakan variabel tipe referensi dengan nilai nol. Ini akan memunculkan pengecualian penunjuk nol, tetapi Anda mungkin tidak tahu bahwa Anda dapat menggunakan metode statis untuk menggunakan variabel tipe referensi dengan nilai nol. Karena metode statis menggunakan pengikatan statis, pengecualian penunjuk nol tidak akan dilempar. Berikut ini contohnya:
Copy kode kodenya sebagai berikut:
Pengujian kelas publik {
public static void main(String args[]){
Menguji myObject = null;
myObject.iAmStaticMethod();
myObject.iAmNonStaticMethod();
}
kekosongan statis pribadi iAmStaticMethod(){
System.out.println("Saya metode statis, dapat dipanggil dengan referensi nol");
}
kekosongan pribadi iAmNonStaticMethod(){
System.out.println("Saya NON metode statis, jangan menelepon saya dengan null");
}
Keluaran:
Copy kode kodenya sebagai berikut:
Saya metode statis, dapat dipanggil dengan referensi nol
Pengecualian di thread "utama" java.lang.NullPointerException
di Testing.main(Testing.java:11)
8) Anda dapat meneruskan null ke metode tersebut, dan metode tersebut dapat menerima tipe referensi apa pun. Misalnya, public void print(Object obj) dapat memanggil print(null) seperti ini. Ini tidak masalah dari sudut pandang kompilasi, namun hasilnya bergantung sepenuhnya pada metodenya. Metode null-safe, seperti metode print dalam contoh ini, jangan memunculkan NullPointerException dan cukup keluar dengan baik. Jika logika bisnis mengizinkannya, disarankan untuk menggunakan metode null-safe.
9) Anda dapat menggunakan operasi == atau != untuk membandingkan nilai nol, tetapi Anda tidak dapat menggunakan algoritma atau operasi logika lain, seperti kurang dari atau lebih besar dari. Tidak seperti SQL, null==null akan mengembalikan nilai true di Java, seperti yang ditunjukkan di bawah ini:
Copy kode kodenya sebagai berikut:
Tes kelas publik {
public static void main(String args[]) melempar InterruptedException {
String abc = nol;
String cde = nol;
jika(abc == cde){
System.out.println("null == null benar di Java");
}
jika(batal != batal){
System.out.println("null != null salah di Java");
}
// pemeriksaan nol klasik
jika(abc==batal){
// melakukan sesuatu
}
// tidak oke, kesalahan waktu kompilasi
jika(abc > nol){
}
}
}
Keluaran:
Copy kode kodenya sebagai berikut:
null == null benar di Java
Ini semua tentang null di Jawa. Dengan beberapa pengalaman dalam pemrograman Java dan menggunakan trik sederhana untuk menghindari pengecualian penunjuk nol, Anda dapat membuat kode Anda aman untuk null. Karena null sering kali digunakan sebagai nilai kosong atau tidak diinisialisasi, hal ini menjadi sumber kebingungan. Untuk metode, penting juga untuk mencatat bagaimana perilaku metode ketika null digunakan sebagai parameter. Secara keseluruhan, ingatlah bahwa null adalah nilai default dari variabel tipe referensi apa pun. Anda tidak dapat menggunakan referensi null untuk memanggil metode instan atau variabel instan apa pun di Java.