了解java.lang.reflect.InvocationTargetException以及它发生原因
在本教程中,我们会看到 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