IllegalArgumentException atau NullPointerException untuk Parameter Null?

1. Perkenalan

Di antara keputusan yang kami buat saat kami menulis aplikasi kami, banyak yang tentang kapan harus membuang pengecualian dan jenis mana yang akan dilempar.

Dalam tutorial singkat ini, kita akan menangani masalah pengecualian mana yang harus dilemparkan ketika seseorang memberikan parameter null ke salah satu metode kita: IllegalArgumentException atau NullPointerException .

Kami akan menjelajahi topik dengan memeriksa argumen untuk kedua sisi.

2. IllegalArgumentException

Pertama, mari kita lihat argumen untuk melempar IllegalArgumentException .

Mari buat metode sederhana yang melempar IllegalArgumentException saat meneruskan null :

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

Sekarang, mari beralih ke argumen yang mendukung IllegalArgumentException .

2.1. Begitulah Cara Javadoc Menggunakannya

Saat kita membaca Javadoc untuk IllegalArgumentException , Javadoc untuk IllegalArgumentException dikatakan digunakan saat nilai ilegal atau tidak sesuai diteruskan ke metode . Kita dapat menganggap objek null sebagai ilegal atau tidak pantas jika metode kita tidak menduganya, dan ini akan menjadi pengecualian yang sesuai untuk kita lempar.

2.2. Ini Sesuai dengan Harapan Pengembang

Selanjutnya, mari kita pikirkan tentang bagaimana kita, sebagai pengembang, berpikir ketika kita melihat jejak tumpukan dalam aplikasi kita. Skenario yang sangat umum di mana kami menerima NullPointerException adalah ketika kami secara tidak sengaja mencoba mengakses objek null . Dalam hal ini, kita akan masuk ke dalam tumpukan sedalam mungkin untuk melihat apa yang kita referensikan yaitu null .

Saat kita mendapatkan IllegalArgumentException , kita cenderung berasumsi bahwa kita mengirimkan sesuatu yang salah ke sebuah metode. Dalam kasus ini, kita akan mencari di tumpukan untuk metode paling bawah yang kita panggil dan mulai debugging kita dari sana. Jika kita mempertimbangkan cara berpikir ini, IllegalArgumentException akan membawa kita ke tumpukan lebih dekat ke tempat kesalahan dibuat.

2.3. Argumen Lainnya

Sebelum kita beralih ke argumen untuk NullPointerException , mari kita lihat beberapa poin yang lebih kecil yang mendukung IllegalArgumentException . Beberapa pengembang merasa bahwa hanya JDK yang harus melempar NullPointerException . Seperti yang akan kita lihat di bagian selanjutnya, Javadoc tidak mendukung teori ini. Argumen lain adalah bahwa penggunaan IllegalArgumentException lebih konsisten karena itulah yang akan kami gunakan untuk nilai parameter ilegal lainnya.

3. NullPointerException

Selanjutnya, mari pertimbangkan argumen untuk NullPointerException .

Mari buat contoh yang menampilkan NullPointerException :

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

3.1. Begitulah Cara Javadoc Menggunakannya

Menurut Javadoc untuk NullPointerException , NullPointerException dimaksudkan untuk digunakan untuk mencoba menggunakan null di mana sebuah objek diperlukan . Jika parameter metode kami tidak dimaksudkan untuk menjadi null , maka kami dapat mempertimbangkan ini sebagai objek yang diperlukan dan menampilkan NullPointerException .

3.2. Ini Konsisten dengan JDK API

Mari luangkan waktu sejenak untuk memikirkan tentang banyak metode JDK umum yang kita panggil selama pengembangan. Banyak dari mereka memunculkan NullPointerException jika kami memberikan null . Selain itu, Objects.requireNonNull () melontarkan NullPointerException jika kita meneruskan null. Menurut dokumentasi Objek , itu ada sebagian besar untuk memvalidasi parameter.

Selain metode JDK yang menampilkan NullPointerException , kita dapat menemukan contoh lain dari jenis pengecualian tertentu yang dikeluarkan dari metode di Collections API. ArrayList.addAll (index, Collection) melontarkan IndexOutOfBoundsException jika indeks berada di luar ukuran daftar dan melontarkan NullPointerException jika koleksinya null . Ini adalah dua tipe pengecualian yang sangat spesifik daripada IllegalArgumentException yang lebih umum .

Kita bisa menganggap IllegalArgumentException dimaksudkan untuk kasus ketika kita tidak memiliki jenis pengecualian yang lebih spesifik yang tersedia untuk kita.

4. Kesimpulan

Seperti yang telah kita lihat di tutorial ini, ini adalah pertanyaan yang tidak memiliki jawaban yang jelas. Dokumentasi untuk kedua pengecualian tersebut tampaknya tumpang tindih karena jika diambil sendiri, keduanya terdengar sesuai. Ada juga argumen tambahan yang menarik untuk kedua sisi berdasarkan bagaimana developer melakukan debugging dan pola yang terlihat di metode JDK itu sendiri.

Pengecualian manapun yang kita pilih, kita harus konsisten di seluruh aplikasi kita. Selain itu, kami dapat membuat pengecualian kami lebih berguna dengan memberikan informasi yang berarti ke konstruktor pengecualian. Misalnya, aplikasi kita akan lebih mudah untuk di-debug jika kita memberikan nama parameter dalam pesan pengecualian.

Seperti biasa, kode contoh tersedia di GitHub.