logo

InvocationTargetException

The InvocationTargetException je preverjena izjema, ki vsebuje izjemo, ki jo vrže klicana metoda ali konstruktor. Od različice JDK 1.4 dalje je bila ta izjema naknadno vgrajena v skladnost s splošnim mehanizmom veriženja izjem. »Ciljna izjema«, ki je zagotovljena v času gradnje in do katere dostopate prek metode getTargetException(), je zdaj znana kot vzrok, do nje pa je mogoče dostopati prek metode Throwable.getCause(), kot tudi z »podedovano metodo«.

Na kratko, ko prikličemo razred z metodo Method.invoke(), vrže izjemo; ovit je z java.lang.reflect.InvocationTargetException razred.

Vzrok za izjemo InvokationTargetException

Izjema InvokationTargetException se pojavi predvsem med delom z Java Reflection API in poskusite priklicati metodo ali konstruktor v sloju refleksije, ki sam vrže osnovno izjemo.

Odsevna plast vsebuje dejansko izjemo, ki jo vržejo privzete metode.

Kako razrešiti java.lang.reflect.InvocationTargetException

Izjemo InvocationTargetException povzroči klicana metoda, ki vrže izjemo. Osnovno izjemo lahko najdete z metodo getCause(). Zato je treba najti dejansko izjemo in jo razrešiti, da razrešimo izjemo InvocationTargetException.

InvocationTargetException

Razmislite o spodnjem primeru, ki namerno generira izjemo (deljenje z ničlo) v metodi Demo(), ki je priklicana z uporabo Method.invoke(). Tako bo izhod vrgel izjemo AirthmeticException (DividebyZero) in 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); } } 

Izhod:

 Wrapper exception: java.lang.reflect.InvocationTargetException Underlying exception: java.lang.ArithmeticException: / by zero