java.lang.reflect.invocationtargetexception

來源:互聯網
上載者:User

標籤:

bout Sotirios-Efstathios ManeasSotirios-Efstathios (Stathis) Maneas is a postgraduate student at the Department of Informatics and Telecommunications of The National and Kapodistrian University of Athens. His main interests include distributed systems, web crawling, model checking, operating systems, programming languages and web applications. java.lang.reflect.invocationtargetexception – How to handle Invocation Target Exception

Posted by: Sotirios-Efstathios Maneas in exceptions December 31st, 2013

Reflection is commonly used by programs which require the ability to examine or modify the runtime behavior of applications running in the Java Virtual Machine. The reflection layer wraps any thrown exception as an InvocationTargetException. In this way, it is clear whether the exception was actually caused by a failure in the reflection call, or a failure within the method called.

The InvocationTargetException is a checked exception that wraps an exception thrown by an invoked method or constructor. The thrown exception is provided at construction time and can be accessed via the getTargetException method. That exception is known as the cause and can be accessed via the getCause method.

 
For more information about the reflection in Java, please refer to the page here.

Error case

The following code snippet throws an InvocationTargetException:

ReflectionExample.java:

 

 1 package main.java; 2  3 import java.lang.reflect.InvocationTargetException; 4  5 import java.lang.reflect.Method; 6  7       8 public class ReflectionExample { 9 10  @SuppressWarnings("unused")11         private int testMethod(String str) {12             if(str.length() == 0)13                 throw new IllegalArgumentException("The string must contain at least one character!");14             System.out.println("Inside testMethod: argument‘s value equals to: \"" + str + "\"");15             return 0;16     }17     public static void main(String... args) {18             try {19 20                 // Retrieve an instance of the current class as an Object.21                 Class<?> c = Class.forName("main.java.ReflectionExample");22 23                 Object t = c.newInstance();24 25                 Method[] declaredMethods = c.getDeclaredMethods();26 27                 for (Method method : declaredMethods) {28 29                     String methodName = method.getName();30 31                 // Skip the current main method.32 33                     if(methodName.contains("main"))34 35                         continue;36 37                     System.out.format("Invoking %s()%n", methodName);38 39                     try {40 41                         // Declare the method as accessible.42 43                         method.setAccessible(true);44 45      46 47                         /* Invoke the method with a ‘null‘ parameter value, in order48 49                          * for an exception to be thrown. */50 51                         Object returnValue = method.invoke(t, "");52 53      54 55                         System.out.format("%s() returned: %d%n", methodName, returnValue);56 57                     }58 59                     catch (InvocationTargetException ex) {60 61                         System.err.println("An InvocationTargetException was caught!");62 63                         Throwable cause = ex.getCause();64 65                     System.out.format("Invocation of %s failed because of: %s%n",66 67                                 methodName, cause.getMessage());68 69                     }70 71                 }72 73             }74             catch (ClassNotFoundException | InstantiationException | IllegalAccessException ex) {75 76                 System.err.println("The following exception was thrown:");77 78                 ex.printStackTrace();79 80             }81 82         }83 84     }

 

The result of the above snippet is:

1 Invoking testMethod()

2 An InvocationTargetException was caught!

3 Invocation of testMethod failed because of: The string must contain at least one character! 

If we carefully observe the code, we will understand why the InvocationTargetException was thrown. Initially, we get an instance of the ReflectionExample class. Then, we iterate over its declared methods and we call the method under the name testMethod, passing an empty String as an argument.

However, the testMethod throws an IllegalArgumentException, in case the length of the string equals to zero. That exception is wrapped as an InvocationTargetException and is thrown in our sample application.

If we change the 39th line to:

Object returnValue = method.invoke(t, "Hello from Java Code Geeks!");

the execution continues without any exception being thrown. As a result, we get the following result:

1 Invoking testMethod()2     Inside testMethod: argument‘s value equals to: "Hello from Java Code Geeks!"3 4     testMethod() returned: 0

 

 

   
How to deal with the exception

First of all, coding an application using reflection is hard. A developer must have a strong grasp of the internal structure of the Java programming language, because the usage of reflection contains drawbacks and dangers, such as performance overhead and exposure of internal fields and methods.

If you decide to use reflection, consider enclosing your code inside a try-catch statement and manipulate the InvocationTargetException accordingly. Notice that the result of the getCause method can be one of the following:

  1. A null value.
  2. An unchecked exception, such as RuntimeException, IllegalArgumentException, NullPointerException, etc.
  3. A checked exception, such as NameNotFoundException, etc.
  4. A java.lang.Error, such as StackOverflowError, OutOfMemoryError, etc.

In your application’s code, make sure that you check for all aforementioned cases, otherwise your code may produce undesired bugs.

 
This was a tutorial about Java’s InvocationTargetException.

Tagged with: reflection

The essay comes from:http://examples.javacodegeeks.com/java-basics/exceptions/java-lang-reflect-invocationtargetexception-how-to-handle-invocation-target-exception/

 

java.lang.reflect.invocationtargetexception

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.