Yah, saya sudah mencoba memahami dan membaca apa yang menyebabkannya, tetapi saya tidak bisa mendapatkannya:
Saya punya ini di suatu tempat dalam kode saya:
try{
..
m.invoke(testObject);
..
} catch(AssertionError e){
...
} catch(Exception e){
..
}
Masalahnya adalah, ketika ia mencoba untuk memanggil beberapa metode itu melempar
InvocationTargetException
bukannya beberapa pengecualian yang diharapkan lainnya (khusus ArrayIndexOutOfBoundsException
). Ketika saya benar-benar tahu metode apa yang dipanggil saya langsung ke kode metode ini dan menambahkan blok try-catch untuk garis yang ArrayIndexOutOfBoundsException
seharusnya melempar dan itu benar-benar melempar ArrayIndexOutOfBoundsException
seperti yang diharapkan. Namun ketika naik itu entah bagaimana berubah menjadi InvocationTargetException
dan dalam kode di atas catch(Exception e)
e adalah InvocationTargetException
dan tidak ArrayIndexOutOfBoundsException
seperti yang diharapkan.
Apa yang bisa menyebabkan perilaku seperti itu atau bagaimana saya bisa memeriksa hal seperti itu?
sumber
InvocationTargetException
", saya baru saja menemukan bahwa jika Anda mendapatkannya dicetak menggunakanexception.printStackTrace()
, Anda hanya melihat bagian "Disebabkan Oleh:" bukannya bagian atas / bagian normal.try {...} catch (InvocationTargetException ex) { log.error("oops!", ex.getCause()) }
atau...catch... { throw ex.getCause() }
you just look at the "Caused By:" section instead of the top half/normal section
Pengecualian dilemparkan jika
Jadi jika metode, yang telah dipanggil dengan API refleksi, melempar pengecualian (pengecualian runtime misalnya), API refleksi akan membungkus pengecualian menjadi
InvocationTargetException
.sumber
Gunakan
getCause()
metode padaInvocationTargetException
untuk mengambil pengecualian asli.sumber
Dari Javadoc of Method.invoke ()
Pengecualian ini dilemparkan jika metode yang disebut melemparkan pengecualian.
sumber
java.lang.reflect.Proxy
contoh yang menambah objek terbungkus. SetiapProxy
anggun menangani pengecualian tertentu (mungkin dilemparkan oleh objek yang dibungkus) dengan menggunakan miliknya sendiriInvocationHandler
. Untuk pengecualian yang beriak melalui kaskade ini hingga mencapai penangan / proxy pemanggilan yang benar, di masing-masingInvocationHandler
, saya akan menangkapInvocationTargetException
, membuka bungkusannya, memeriksa apakah pengecualian yang dibungkus adalahinstanceof
pengecualian untuk ditangani oleh iniInvocationHandler
. Jika itu bukaninstanceof
, saya akan melemparkan pengecualian yang terbuka ... benar?Itu
InvocationTargetException
mungkin membungkus AndaArrayIndexOutOfBoundsException
. Tidak ada yang bisa mengatakan di muka ketika menggunakan refleksi apa metode itu bisa melempar - jadi daripada menggunakanthrows Exception
pendekatan, semua pengecualian ditangkap dan dimasukkan ke dalamInvocationTargetException
.sumber
Ini akan mencetak baris kode yang tepat dalam metode tertentu, yang ketika dipanggil, menimbulkan pengecualian:
sumber
Ini menggambarkan sesuatu seperti,
sumber
Anda dapat membandingkan dengan Kelas pengecualian asli menggunakan metode getCause () seperti ini:
sumber
Saya memiliki
java.lang.reflect.InvocationTargetException
kesalahan dari pernyataan yang memanggil objek logger di eksternalclass
di dalamtry
/catch
blok di sayaclass
.Melangkah melalui kode di Eclipse debugger & melayang mouse di atas pernyataan logger saya melihat logger
object
itunull
(beberapa konstanta eksternal perlu dipakai di bagian paling atas dari sayaclass
).sumber
Pengecualian ini dilemparkan jika metode yang mendasarinya (metode yang disebut menggunakan Refleksi) melempar pengecualian.
Jadi jika metode, yang telah dipanggil oleh API refleksi, melempar pengecualian (seperti misalnya pengecualian runtime), API refleksi akan membungkus pengecualian menjadi InvocationTargetException.
sumber
Saya menghadapi masalah yang sama. Saya menggunakan e.getCause (). GetCause () kemudian saya menemukan bahwa itu karena parameter yang salah yang saya lewati. Ada nullPointerException dalam mengambil nilai dari salah satu parameter. Semoga ini bisa membantu Anda.
sumber
sumber
Kesalahan hilang setelah saya melakukan Clean-> Run xDoclet-> Run xPackaging.
Di ruang kerja saya, di ecllipse.
sumber