1. Gambaran keseluruhan
Semasa bekerja dengan Java Reflection API, biasa dengan java.lang.reflect.InvocationTargetException . Dalam tutorial ini, kita akan melihatnya dan bagaimana mengatasinya dengan contoh mudah .
2. Sebab InvocationTargetException
Ia berlaku terutamanya ketika kita bekerja dengan lapisan pantulan dan berusaha menggunakan kaedah atau konstruktor yang membuang pengecualian yang mendasarinya sendiri.
Lapisan pantulan membungkus pengecualian sebenar yang dilemparkan dengan kaedah dengan InvocationTargetException . Mari cuba memahaminya dengan contoh.
Mari tulis kelas dengan kaedah yang sengaja membuat pengecualian:
public class InvocationTargetExample { public int divideByZeroExample() { return 1 / 0; } }
Sekarang, mari kita gunakan kaedah di atas menggunakan refleksi dalam Ujian JUnit 5 Mudah:
InvocationTargetExample targetExample = new InvocationTargetExample(); Method method = InvocationTargetExample.class.getMethod("divideByZeroExample"); Exception exception = assertThrows(InvocationTargetException.class, () -> method.invoke(targetExample));
Dalam kod di atas, kami telah menegaskan InvocationTargetException , yang dilemparkan semasa menggunakan kaedah. Perkara penting yang perlu diperhatikan di sini ialah pengecualian sebenar - ArithmeticException dalam kes ini - terbungkus dalam InvocationTargetException.
Sekarang, persoalan yang terlintas di fikiran adalah, mengapa refleksi tidak menimbulkan pengecualian sebenarnya?
Sebabnya ialah ia membolehkan kita memahami apakah Pengecualian berlaku kerana kegagalan memanggil kaedah melalui lapisan pantulan atau adakah ia berlaku dalam kaedah itu sendiri.
3. Bagaimana Mengendalikan InvocationTargetException ?
Di sini, pengecualian yang mendasari sebenarnya adalah penyebab InvocationTargetException , jadi kita dapat menggunakan Throwable.getCause () untuk mendapatkan lebih banyak maklumat mengenainya.
Mari lihat bagaimana kita dapat menggunakan getCause () untuk mendapatkan pengecualian sebenar dalam contoh yang sama seperti yang digunakan di atas:
assertEquals(ArithmeticException.class, exception.getCause().getClass());
Di sini, kami telah menggunakan kaedah getCause () pada objek pengecualian yang sama yang dilemparkan. Dan kami telah menegaskan ArithmeticException.class sebagai penyebab pengecualian.
Oleh itu, setelah mendapat pengecualian yang mendasari, kita dapat melemparkan kembali yang sama, membungkusnya dengan beberapa pengecualian khusus, atau hanya mencatat pengecualian berdasarkan keperluan kita.
4. Kesimpulan
Dalam artikel pendek ini, kita telah melihat bagaimana lapisan pantulan membungkus pengecualian yang mendasari. Kami juga telah melihat bagaimana menentukan sebab yang mendasari InvocationTargetException dan bagaimana menangani senario seperti itu dengan contoh yang mudah.
Seperti biasa, kod yang digunakan dalam artikel ini terdapat di GitHub.