IllegalArgumentException atau NullPointerException untuk Null Parameter?

1. Pengenalan

Di antara keputusan yang kami buat semasa menulis aplikasi kami, banyak mengenai kapan membuang pengecualian dan jenis yang hendak dilemparkan.

Dalam tutorial ringkas ini, kita akan mengatasi masalah pengecualian mana yang dilemparkan ketika seseorang melewati parameter nol ke salah satu kaedah kami: IllegalArgumentException atau NullPointerException .

Kami akan meneroka topik ini dengan meneliti hujah untuk kedua-dua belah pihak.

2. Pengecualian ArgumentElegal

Pertama, mari kita lihat hujah untuk melemparkan IllegalArgumentException .

Mari kita mencipta satu kaedah yang mudah yang menerbangkan yang IllegalArgumentException apabila meluluskan null :

public void processSomethingNotNull(Object myParameter) { if (myParameter == null) { throw new IllegalArgumentException("Parameter 'myParameter' cannot be null"); } }

Sekarang, mari kita beralih ke hujah yang memihak kepada IllegalArgumentException .

2.1. Inilah Cara Javadoc Menggunakannya

Apabila kami membaca Javadoc for IllegalArgumentException , ia mengatakan bahawa ia digunakan apabila nilai haram atau tidak sesuai diteruskan ke suatu kaedah . Kita boleh menganggap objek kosong tidak sah atau tidak sesuai jika kaedah kita tidak menjangkakannya, dan ini akan menjadi pengecualian yang sesuai untuk kita lemparkan.

2.2. Ia Sesuai dengan Harapan Pembangun

Seterusnya, mari kita fikirkan bagaimana kita, sebagai pembangun, berfikir ketika kita melihat jejak timbunan dalam aplikasi kita. Senario yang sangat biasa di mana kita menerima NullPointerException adalah ketika kita secara tidak sengaja cuba mengakses objek kosong . Dalam kes ini, kita akan masuk sedalam mungkin untuk melihat apa yang kita rujuk itu tidak ada .

Apabila kita mendapat IllegalArgumentException , kita mungkin akan menganggap bahawa kita melakukan sesuatu yang salah ke suatu kaedah. Dalam kes ini, kami akan mencari kaedah yang paling banyak dipanggil dan memulakan penyahpepijatan dari sana. Sekiranya kita mempertimbangkan cara berfikir ini, IllegalArgumentException akan membawa kita ke dalam timbunan kita lebih dekat ke tempat kesalahan itu dilakukan.

2.3. Hujah Lain

Sebelum kita beralih ke hujah untuk NullPointerException , mari kita lihat beberapa perkara yang lebih kecil yang memihak kepada IllegalArgumentException . Sebilangan pemaju merasakan bahawa hanya JDK yang membuang NullPointerException . Seperti yang akan kita lihat di bahagian seterusnya, Javadoc tidak menyokong teori ini. Argumen lain adalah bahawa lebih konsisten menggunakan IllegalArgumentException kerana itulah yang akan kita gunakan untuk nilai parameter haram yang lain.

3. NullPointerException

Seterusnya, mari kita pertimbangkan hujah untuk NullPointerException .

Mari buat contoh yang melontarkan NullPointerException :

public void processSomethingElseNotNull(Object myParameter) { if (myParameter == null) { throw new NullPointerException("Parameter 'myParameter' cannot be null"); } }

3.1. Inilah Cara Javadoc Menggunakannya

Menurut Javadoc untuk NullPointerException , NullPointerException dimaksudkan untuk digunakan untuk berusaha menggunakan null di mana objek diperlukan . Sekiranya parameter kaedah kami tidak dimaksudkan untuk menjadi nol , maka kami dapat menganggap ini sebagai objek yang diperlukan dan membuang NullPointerException .

3.2. Ini Selaras dengan API JDK

Mari luangkan masa untuk memikirkan banyak kaedah JDK biasa yang kita sebut semasa pembangunan. Sebilangan besar daripada mereka membuang NullPointerException jika kita memberikan nol . Selain itu, Objects.requireNonNull () membuang NullPointerException jika kita lulus dalam nol. Menurut dokumentasi Objek , kebanyakannya terdapat untuk mengesahkan parameter.

Sebagai tambahan kepada kaedah JDK yang melemparkan NullPointerException , kita dapat menemui contoh lain dari jenis pengecualian khusus yang dilemparkan dari kaedah di API Koleksi. ArrayList.addAll (indeks, Koleksi) melemparkan IndexOutOfBoundsException jika indeks berada di luar ukuran senarai dan melemparkan NullPointerException jika koleksi itu nol . Ini adalah dua jenis pengecualian yang sangat spesifik daripada IllegalArgumentException yang lebih umum .

Kami boleh menganggap IllegalArgumentException dimaksudkan untuk kes-kes apabila kami tidak mempunyai jenis pengecualian yang lebih khusus.

4. Kesimpulan

Seperti yang telah kita lihat dalam tutorial ini, ini adalah soalan yang tidak mempunyai jawapan yang jelas. Dokumentasi untuk dua pengecualian itu nampaknya tumpang tindih kerana apabila diambil sendiri, keduanya kedengaran sesuai. Terdapat juga argumen tambahan yang menarik untuk kedua-dua belah pihak berdasarkan bagaimana pembangun melakukan penyahpepijatan dan corak yang dilihat dalam kaedah JDK itu sendiri.

Apa pun pengecualian yang kami pilih, kami harus konsisten sepanjang permohonan kami. Selain itu, kami dapat menjadikan pengecualian kami lebih berguna dengan memberikan maklumat yang bermakna kepada pembangun pengecualian. Sebagai contoh, aplikasi kami akan lebih mudah untuk debug jika kami memberikan nama parameter dalam pesan pengecualian.

Seperti biasa, kod contoh boleh didapati di GitHub.