Apa Penyebab java.lang.reflect.InvocationTargetException?

1. Ikhtisar

Saat bekerja dengan Java Reflection API, java.lang.reflect.InvocationTargetException adalah hal yang umum . Dalam tutorial ini, kita akan melihatnya dan bagaimana menanganinya dengan contoh sederhana .

2. Penyebab InvocationTargetException

Ini terutama terjadi saat kita bekerja dengan lapisan refleksi dan mencoba memanggil metode atau konstruktor yang melontarkan pengecualian yang mendasarinya sendiri.

Lapisan refleksi membungkus pengecualian sebenarnya yang muncul oleh metode dengan InvocationTargetException . Mari kita coba memahaminya dengan sebuah contoh.

Mari kita menulis kelas dengan metode yang sengaja menampilkan pengecualian:

public class InvocationTargetExample { public int divideByZeroExample() { return 1 / 0; } }

Sekarang, mari panggil metode di atas menggunakan refleksi dalam Tes JUnit 5 Sederhana:

InvocationTargetExample targetExample = new InvocationTargetExample(); Method method = InvocationTargetExample.class.getMethod("divideByZeroExample"); Exception exception = assertThrows(InvocationTargetException.class, () -> method.invoke(targetExample));

Dalam kode di atas, kami telah menegaskan InvocationTargetException , yang dilemparkan saat menjalankan metode. Satu hal penting yang perlu diperhatikan di sini adalah bahwa pengecualian sebenarnya - ArithmeticException dalam kasus ini - digabungkan ke dalam InvocationTargetException.

Sekarang, pertanyaan yang muncul di benak adalah, mengapa refleksi tidak melemparkan pengecualian yang sebenarnya di tempat pertama?

Alasannya adalah memungkinkan kita untuk memahami apakah Exception terjadi karena kegagalan dalam memanggil metode melalui lapisan refleksi atau apakah itu terjadi di dalam metode itu sendiri.

3. Bagaimana Menangani InvocationTargetException ?

Di sini, pengecualian mendasar yang sebenarnya adalah penyebab InvocationTargetException , jadi kita bisa menggunakan Throwable.getCause () untuk mendapatkan informasi lebih lanjut tentangnya.

Mari kita lihat bagaimana kita bisa menggunakan getCause () untuk mendapatkan pengecualian sebenarnya dalam contoh yang sama yang digunakan di atas:

assertEquals(ArithmeticException.class, exception.getCause().getClass());

Di sini, kita telah menggunakan metode getCause () pada objek pengecualian yang sama yang dilemparkan. Dan kami telah menegaskan ArithmeticException.class sebagai penyebab pengecualian.

Jadi, setelah kami mendapatkan pengecualian yang mendasarinya, kami dapat membuang kembali yang sama, membungkusnya dalam beberapa pengecualian khusus, atau cukup mencatat pengecualian berdasarkan kebutuhan kami.

4. Kesimpulan

Dalam artikel singkat ini, kita telah melihat bagaimana lapisan refleksi membungkus pengecualian yang mendasarinya. Kami juga telah melihat cara menentukan penyebab yang mendasari InvocationTargetException dan cara menangani skenario seperti itu dengan contoh sederhana.

Seperti biasa, kode yang digunakan dalam artikel ini tersedia di GitHub.