Yah, aku've mencoba untuk memahami dan membaca apa yang bisa menyebabkan hal itu, tapi saya hanya bisa't mendapatkan ini:
Aku punya ini di suatu tempat di dalam kode saya:
try{
..
m.invoke(testObject);
..
} catch(AssertionError e){
...
} catch(Exception e){
..
}
Masalahnya adalah bahwa, ketika mencoba untuk memanggil beberapa metode yang melempar
InvocationTargetException
bukan lain diharapkan pengecualian (khusus ArrayIndexOutOfBoundsException
).
Seperti yang saya benar-benar tahu metode apa yang dipanggil saya langsung pergi ke metode ini kode dan menambahkan try-catch blok baris yang kira untuk membuang ArrayIndexOutOfBoundsException
dan itu benar-benar melemparkan ArrayIndexOutOfBoundsException
seperti yang diharapkan. Namun ketika akan naik itu
entah bagaimana berubah menjadi InvocationTargetException
dan dalam kode di atas catch(Exception e)
e InvocationTargetException
dan tidak ArrayIndexOutOfBoundsException
seperti yang diharapkan.
Apa yang bisa menyebabkan suatu perilaku atau bagaimana saya dapat periksa hal seperti itu?
Anda've menambahkan tingkat tambahan abstraksi dengan memanggil metode dengan refleksi. Refleksi lapisan yang membungkus terkecuali dalam sebuah InvocationTargetException
, yang memungkinkan anda untuk memberitahu perbedaan antara pengecualian benar-benar disebabkan oleh kegagalan dalam refleksi panggilan (mungkin anda daftar argumen itu't berlaku, misalnya) dan kegagalan dalam metode yang disebut.
Hanya membuka penyebab dalam InvocationTargetException
dan'll mendapatkan ke yang asli.
Pengecualian dilemparkan jika
InvocationTargetException - jika yang mendasari metode melempar pengecualian.
Jadi jika metode, yang telah dipanggil dengan refleksi API, melempar pengecualian (pengecualian runtime misalnya), refleksi API akan membungkus pengecualian menjadi InvocationTargetException
.
Dari Awal dari Metode.invoke()
Melempar: InvocationTargetException - jika yang mendasari metode melempar pengecualian.
Ini pengecualian dilemparkan jika metode yang disebut melemparkan pengecualian.
Bahwa InvocationTargetException
adalah mungkin membungkus anda ArrayIndexOutOfBoundsException
. Tidak ada yang tahu dimuka ketika menggunakan refleksi apakah metode itu dapat membuang -- jadi, daripada menggunakan melempar Pengecualian
pendekatan, semua pengecualian yang tertangkap dan dibungkus dalam InvocationTargetException
.
Ini akan mencetak tepat pada baris kode dalam metode tertentu, yang ketika dipanggil, mengangkat pengecualian:
try {
// try code
..
m.invoke(testObject);
..
} catch (InvocationTargetException e) {
// Answer:
e.getCause().printStackTrace();
} catch (Exception e) {
// generic exception handling
e.printStackTrace();
}
Ini menjelaskan sesuatu seperti,
InvocationTargetException adalah memeriksa pengecualian yang membungkus sebuah pengecualian dilemparkan oleh dipanggil method atau konstruktor. Sebagai rilis 1.4, pengecualian ini telah dipasang untuk memenuhi tujuan umum pengecualian-chaining mekanisme. "target pengecualian" yang diberikan pada waktu konstruksi dan diakses melalui getTargetException() metode ini sekarang diketahui sebagai penyebab, dan mungkin diakses melalui Throwable.getCause() metode, serta tersebut "warisan metode."
Anda dapat membandingkan dengan yang asli, kecuali Kelas menggunakan getCause() metode seperti ini :
try{
...
} catch(Exception e){
if(e.getCause().getClass().equals(AssertionError.class)){
// handle your exception 1
} else {
// handle the rest of the world exception
}
}
Aku punya jawa.lang.mencerminkan.InvocationTargetException
kesalahan dari pernyataan memanggil logger objek eksternal kelas
dalam mencoba
/ menangkap
blok dalam kelas
.
Melangkah melalui kode di Eclipse debugger & melayang mouse di atas logger pernyataan saya melihat logger objek
adalah null
(eksternal beberapa konstanta yang dibutuhkan untuk menjadi contoh di atas saya kelas
).
Ini pengecualian dilemparkan jika yang mendasari metode(metode yang disebut menggunakan Refleksi) throws exception.
Jadi jika metode, yang telah dipanggil oleh API refleksi, melempar pengecualian (seperti misalnya runtime exception), refleksi API akan membungkus pengecualian menjadi InvocationTargetException.
Saya menghadapi masalah yang sama. Aku digunakan e.getCause().getCause() kemudian saya menemukan bahwa itu adalah karena salah parameter aku lewat. Ada nullPointerException dalam mengambil nilai dari satu parameter. Berharap ini akan membantu anda.