logo

InvocationTargetException

De InvocationTargetException is een gecontroleerde uitzondering die een uitzondering bevat die wordt gegenereerd door een aangeroepen methode of constructor. Sinds JDK 1.4 is deze uitzondering achteraf aangepast om te voldoen aan het uitzonderingsketenmechanisme voor algemene doeleinden. De 'doeluitzondering' die tijdens de bouwperiode wordt opgegeven en waartoe toegang wordt verkregen via de getTargetException()-methode, staat nu bekend als de oorzaak en kan worden benaderd via de Throwable.getCause()-methode, evenals de 'legacy-methode'.

In een notendop: wanneer we een klasse aanroepen met behulp van Method.invoke(), genereert deze een uitzondering; het is ingepakt door de java.lang.reflect.InvocationTargetException klas.

Oorzaak van InvokationTargetException

De InvokationTargetException treedt voornamelijk op tijdens het werken met de Java Reflection API en probeer een methode of constructor aan te roepen in de reflectielaag die zelf een onderliggende uitzondering genereert.

De reflectielaag bevat de daadwerkelijke uitzondering die door de standaardmethoden wordt gegenereerd.

Hoe java.lang.reflect.InvocationTargetException op te lossen

De InvocationTargetException wordt veroorzaakt door de aangeroepen methode, die een uitzondering genereert. De onderliggende uitzondering kan worden gevonden met behulp van de getCause() -methode. Daarom is het noodzakelijk om de daadwerkelijke uitzondering te vinden en deze op te lossen om de InvocationTargetException op te lossen.

InvocationTargetException

Beschouw het onderstaande voorbeeld, waarbij opzettelijk een uitzondering wordt gegenereerd (delen door nul) in de methode Demo(), die wordt aangeroepen met behulp van Method.invoke(). De uitvoer genereert dus zowel de AirthmeticException (DividebyZero) als 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); } } 

Uitgang:

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