Próbowałem zrozumieć i przeczytać, co może to spowodować, ale po prostu nie mogę tego zrozumieć:
Mam to gdzieś w moim kodzie:
try{
..
m.invoke(testObject);
..
} catch(AssertionError e){
...
} catch(Exception e){
..
}
Chodzi o to, że gdy próbuje wywołać jakąś metodę, rzuca
InvocationTargetException
zamiast jakiegoś innego oczekiwanego wyjątku (konkretnie ArrayIndexOutOfBoundsException
). Ponieważ tak naprawdę wiem, która metoda jest wywoływana, przeszedłem prosto do tego kodu metody i dodałem blok try-catch dla linii, która ma się rzucać ArrayIndexOutOfBoundsException
i naprawdę rzuciła ArrayIndexOutOfBoundsException
zgodnie z oczekiwaniami. Jednak gdy idziemy w górę, jakoś zmienia się InvocationTargetException
w powyższym kodzie iw kodzie catch(Exception e)
e jest InvocationTargetException
i nie jest ArrayIndexOutOfBoundsException
zgodnie z oczekiwaniami.
Co może powodować takie zachowanie lub jak mogę sprawdzić takie rzeczy?
źródło
InvocationTargetException
”, właśnie odkryłem, że jeśli masz to wydrukowane za pomocąexception.printStackTrace()
, po prostu spójrz na sekcję „Przyczyna:” zamiast górnej połowy / normalnej sekcji.try {...} catch (InvocationTargetException ex) { log.error("oops!", ex.getCause()) }
lub...catch... { throw ex.getCause() }
you just look at the "Caused By:" section instead of the top half/normal section
Wyjątek jest zgłaszany, jeśli
Jeśli więc metoda, która została wywołana za pomocą interfejsu API refleksji, zgłosi wyjątek (na przykład wyjątek środowiska wykonawczego), interfejs API refleksji zapisze wyjątek w zmiennej
InvocationTargetException
.źródło
Użyj
getCause()
metody na,InvocationTargetException
aby pobrać oryginalny wyjątek.źródło
Z Javadoc metody Method.invoke ()
Ten wyjątek jest zgłaszany, jeśli wywołana metoda zgłosiła wyjątek.
źródło
java.lang.reflect.Proxy
przypadków powiększania owiniętego obiektu. Każdy zProxy
wdziękiem obsługuje określony wyjątek (być może zgłoszony przez zawinięty obiekt), używając własnegoInvocationHandler
. Aby wyjątek przeszedł przez tę kaskadę aż do osiągnięcia właściwego modułu obsługi / proxy wywołania, w każdym z nichInvocationHandler
wychwyciłemInvocationTargetException
, rozpakowałem go, sprawdziłem, czy zawinięty wyjątek jestinstanceof
wyjątkiem, który ma zostać obsłużonyInvocationHandler
. Jeśli nieinstanceof
, rzuciłbym nieopakowany wyjątek ... prawda?To
InvocationTargetException
prawdopodobnie kończy twojeArrayIndexOutOfBoundsException
. Używając refleksji, nie da się powiedzieć z góry, co ta metoda może rzucić - więc zamiast stosowaćthrows Exception
podejście, wszystkie wyjątki są wychwytywane i zamykaneInvocationTargetException
.źródło
Spowoduje to wydrukowanie dokładnego wiersza kodu w określonej metodzie, która po wywołaniu zgłosiła wyjątek:
źródło
To opisuje coś takiego,
źródło
Możesz porównać z oryginalną klasą wyjątków za pomocą metody getCause () w następujący sposób:
źródło
Wystąpił
java.lang.reflect.InvocationTargetException
błąd w instrukcji wywołującej obiekt rejestrujący w zewnętrznym bloku / w moimclass
pliku .try
catch
class
Przechodząc przez kod w debuggerze Eclipse i najeżdżając myszką na instrukcję loggera, zauważyłem, że logger
object
byłnull
(niektóre stałe zewnętrzne musiały być tworzone na samym szczycie mojejclass
).źródło
Ten wyjątek jest zgłaszany, jeśli podstawowa metoda (metoda nazywana za pomocą Reflection) zgłasza wyjątek.
Jeśli więc metoda, która została wywołana przez API refleksji, zgłasza wyjątek (jak na przykład wyjątek środowiska wykonawczego), API refleksji zawinie wyjątek w InvocationTargetException.
źródło
Miałem ten sam problem. Użyłem e.getCause (). GetCause (), a potem okazało się, że to z powodu niepoprawnych parametrów, które przekazałem. Podczas pobierania wartości jednego z parametrów wystąpił wyjątek nullPointerException. Mam nadzieję, że to ci pomoże.
źródło
źródło
Błąd zniknął po tym, jak zrobiłem Clean-> Run xDoclet-> Run xPackaging.
W moim obszarze roboczym, w ecllipse.
źródło