The InvocationTargetException je provjerena iznimka koja sadrži iznimku koju je izbacila pozvana metoda ili konstruktor. Od JDK 1.4, ova je iznimka naknadno opremljena kako bi bila u skladu s mehanizmom ulančavanja iznimki opće namjene. 'Ciljna iznimka' koja se daje u vrijeme izgradnje i kojoj se pristupa putem metode getTargetException() sada je poznata kao uzrok i može joj se pristupiti putem metode Throwable.getCause(), kao i 'naslijeđene metode.'
Ukratko, kada pozovemo klasu koristeći Method.invoke(), ona izbacuje iznimku; obavijeno je java.lang.reflect.InvocationTargetException razreda.
Uzrok InvokationTargetException
Iznimka InvokationTargetException uglavnom se javlja tijekom rada s Java Reflection API i pokušajte pozvati metodu ili konstruktor u sloju refleksije koji sam izbacuje temeljnu iznimku.
Sloj refleksije sadrži stvarnu iznimku koju su izbacile zadane metode.
Kako riješiti java.lang.reflect.InvocationTargetException
Iznimku InvocationTargetException uzrokuje pozvana metoda koja izbacuje iznimku. Temeljna iznimka može se pronaći pomoću metode getCause(). Stoga je potrebno pronaći stvarnu iznimku i razriješiti je kako bi se riješila InvocationTargetException.
Razmotrite donji primjer, koji namjerno generira iznimku (dijeljenje s nulom) u metodi Demo(), koja se poziva pomoću Method.invoke(). Stoga će izlaz izbaciti i AirthmeticException (DividebyZero) i InvokationTargetException.
TestInvokationException.java:
import java.lang.reflect.Method; public class TestInvocationException { public static void main(String[] args) { TargetInvocation ti = new TargetInvocation(); // Accessing all the methods of TargetInvocationClass: Method[] m = TargetInvocation.class.getMethods(); try { // Invoking the first method of the TargetInvocatioClass: m[0].invoke(ti); } catch(Exception e) { // Printing the wrapper exception: System.out.println('Wrapper exception: ' + e); // Printing the 'actual' exception: System.out.println('Underlying exception: ' + e.getCause()); } } } class TargetInvocation{ public void Demo() { // Dividing by zero to intentionally throw an exception: System.out.println(10 / 0); } }
Izlaz:
Wrapper exception: java.lang.reflect.InvocationTargetException Underlying exception: java.lang.ArithmeticException: / by zero