了解java.lang.reflect.InvocationTargetException以及它发生原因

时间:2020-02-23 14:35:03  来源:igfitidea点击:

在本教程中,我们会看到 java.lang.reflect.InvocationTargetException

我们可能会得到java.lang.reflect.InvocationTargetException,同时使用Java中的反射。

java.lang.reflect.InvocationTargetException的原因

在调用方法或者构造函数抛出任何异常时,反射层会抛出此异常。

java.lang.reflect.InvocationTargetException通过实际方法或者构造函数调用抛出潜在的异常。

让我们在例子中看到这个:创建一个名为的简单类 StringUtils.java
它会有方法 getLengthOfString()它没有NULL处理,因此当我们将null传递给此方法时,它将抛出java.lang.nullpointerexception。

package org.igi.theitroad;
 
public class StringUtils {
	
	public int getLengthOfString(String str)
	{
		return str.length();
	}
}

创建花药类以使用反射调用getLengthofstring。

package org.igi.theitroad;
 
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
 
public class ReflectionMain {
 
	public static void main(String[] args) {
		StringUtils su=new StringUtils();
		
		try {
			Class[] paramString = new Class[1];
			paramString[0] = String.class;
			Method method=StringUtils.class.getMethod("getLengthOfString",paramString);
			String str=null;
			Object len = method.invoke(su, str);
			System.out.println(len);
		} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
			e.printStackTrace();
		}
	}
}

输出:

java.lang.reflect.InvocationTargetException
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:567)
	at org.igi.theitroad.ReflectionMain.main(ReflectionMain.java:16)
Caused by: java.lang.NullPointerException
	at org.igi.theitroad.StringUtils.getLengthOfString(StringUtils.java:7)
	... 5 more

你可以看到,我们正在得到 java.lang.reflect.InvocationTargetException由于潜在的nullpointerexception,异常。

反射层软件包 java.lang.reflect.InvocationTargetException实际异常围绕脱离,在反射API调用期间提出了此异常。

处理InvocationTargetException.

作为底层异常是InvocationTargetException的实际原因,我们可以使用 Throwable's getCause()获取实际底层异常的方法并使用它来记录或者重新启动异常。

package org.igi.theitroad;
 
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
 
public class ReflectionMain {
 
	public static void main(String[] args) {
		StringUtils su=new StringUtils();
		
		try {
			Class[] paramString = new Class[1];
			paramString[0] = String.class;
			Method method=StringUtils.class.getMethod("getLengthOfString",paramString);
			String str=null;
			Object len = method.invoke(su, str);
			System.out.println(len);
		} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
			Throwable actualException = e.getCause();
			actualException.printStackTrace();
		}
	}
}

java.lang.nullpointerexception在org.igi.theitroad.tringutils.getlengthofstring(Stringutils.java:7)在java.base/jdk.internal.reflect.nativemethodaccessorimpl.invoke0(本机方法)在java.base/jdk.internal.reflect .nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:62)在java.base/jdk.internal.reflect.delegationmethodaccessorimpl.invoke(delegationmethodaccessorimpl.java:43)在java.base/java.lang.reflect.method.invoke(方法.java :567)在org.igi.theitroad.reflectionmain.main(reflectionmain.java:16)

解决 InvocationTargetException,我们需要解决上面示例中的底层异常(nullpointerexception)。
让我们处理null检查 StringUtils.java类,你不会再出现任何例外。

package org.igi.theitroad;
 
public class StringUtils {
 
	public int getLengthOfString(String str) {
		if (str != null) {
			return str.length();
		} else
			return 0;
	}
 
}

现在在我们运行步时 ReflectionMain.java再次,我们将看到以下输出:

0