Java异常处理之InvocationTargetException(反射异常)

我的未来我决定 提交于 2021-02-17 18:46:47

<div id="cnblogs_post_body" class="blogpost-body"><p><strong><span style="font-size: 18pt;">&nbsp;Java异常处理之InvocationTargetException(反射异常)<br></span></strong></p> <p>&nbsp;</p> <p>InvocationTargetException异常由Method.invoke(obj, args...)方法抛出。<strong><span style="font-size: 16px;"><span style="color: #ff0000;">当被调用的方法的内部抛出了异常而没有被捕获时,将由此异常接收!!!</span></span></strong></p> <p><strong>示例:</strong></p> <div class="dp-highlighter bg_java"><ol class="dp-j" start="1"> <li class="alt"><span class="keyword">package&nbsp;com.zzj.test.reflect;&nbsp;&nbsp;</span></li> <li>&nbsp;&nbsp;</li> <li class="alt"><span class="keyword">public&nbsp;<span class="keyword">class&nbsp;Reflect&nbsp;{&nbsp;&nbsp;</span></span></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public&nbsp;<span class="keyword">void&nbsp;run(<span class="keyword">int&nbsp;i)&nbsp;<span class="keyword">throws&nbsp;ZeroException&nbsp;{&nbsp;&nbsp;</span></span></span></span></li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B&nbsp;b&nbsp;=&nbsp;<span class="keyword">new&nbsp;B();&nbsp;&nbsp;</span></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b.run(i);&nbsp;&nbsp;</li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li> <li>}&nbsp;&nbsp;</li> <li class="alt">&nbsp;&nbsp;</li> <li><span class="keyword">class&nbsp;B&nbsp;{&nbsp;&nbsp;</span></li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public&nbsp;<span class="keyword">void&nbsp;run(<span class="keyword">int&nbsp;i)&nbsp;<span class="keyword">throws&nbsp;ZeroException&nbsp;{&nbsp;&nbsp;</span></span></span></span></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if&nbsp;(i&nbsp;&lt;&nbsp;<span class="number">0)&nbsp;{&nbsp;&nbsp;</span></span></li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">throw&nbsp;<span class="keyword">new&nbsp;ZeroException(<span class="string">"参数不能小于零!");&nbsp;&nbsp;</span></span></span></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">"参数:"&nbsp;+&nbsp;i);&nbsp;&nbsp;</span></li> <li>&nbsp;&nbsp;</li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li> <li>}&nbsp;&nbsp;</li> <li class="alt">&nbsp;&nbsp;</li> <li><span class="keyword">class&nbsp;ZeroException&nbsp;<span class="keyword">extends&nbsp;Exception&nbsp;{&nbsp;&nbsp;</span></span></li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private&nbsp;<span class="keyword">static&nbsp;<span class="keyword">final&nbsp;<span class="keyword">long&nbsp;serialVersionUID&nbsp;=&nbsp;1L;&nbsp;&nbsp;</span></span></span></span></li> <li>&nbsp;&nbsp;</li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private&nbsp;String&nbsp;detailMessage;&nbsp;&nbsp;</span></li> <li>&nbsp;&nbsp;</li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public&nbsp;ZeroException(String&nbsp;detailMessage)&nbsp;{&nbsp;&nbsp;</span></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this.detailMessage&nbsp;=&nbsp;detailMessage;&nbsp;&nbsp;</span></li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li> <li>&nbsp;&nbsp;</li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public&nbsp;String&nbsp;getMessage()&nbsp;{&nbsp;&nbsp;</span></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return&nbsp;detailMessage;&nbsp;&nbsp;</span></li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li> <li>}&nbsp;&nbsp;</li>

</ol></div> <p>测试:</p> <div class="dp-highlighter bg_java"> <div class="bar">&nbsp;</div> <ol class="dp-j" start="1"> <li class="alt"><span class="keyword">package&nbsp;com.zzj.test.reflect;&nbsp;&nbsp;</span></li> <li>&nbsp;&nbsp;</li> <li class="alt"><span class="keyword">import&nbsp;java.lang.reflect.InvocationTargetException;&nbsp;&nbsp;</span></li> <li><span class="keyword">import&nbsp;java.lang.reflect.Method;&nbsp;&nbsp;</span></li> <li class="alt">&nbsp;&nbsp;</li> <li><span class="keyword">public&nbsp;<span class="keyword">class&nbsp;Test&nbsp;{&nbsp;&nbsp;</span></span></li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public&nbsp;<span class="keyword">static&nbsp;<span class="keyword">void&nbsp;main(String[]&nbsp;args)&nbsp;{&nbsp;&nbsp;</span></span></span></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">try&nbsp;{&nbsp;&nbsp;</span></li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class&lt;?&gt;&nbsp;clazz&nbsp;=&nbsp;Class.forName(<span class="string">"com.zzj.test.reflect.Reflect");&nbsp;&nbsp;</span></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method&nbsp;method&nbsp;=&nbsp;clazz.getMethod(<span class="string">"run",&nbsp;<span class="keyword">int.<span class="keyword">class);&nbsp;&nbsp;</span></span></span></li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method.invoke(clazz.newInstance(),&nbsp;-<span class="number">1);&nbsp;&nbsp;</span></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">catch&nbsp;(ClassNotFoundException&nbsp;e)&nbsp;{&nbsp;&nbsp;</span></li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;</li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">catch&nbsp;(SecurityException&nbsp;e)&nbsp;{&nbsp;&nbsp;</span></li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;</li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">catch&nbsp;(NoSuchMethodException&nbsp;e)&nbsp;{&nbsp;&nbsp;</span></li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;</li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">catch&nbsp;(IllegalArgumentException&nbsp;e)&nbsp;{&nbsp;&nbsp;</span></li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;</li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">catch&nbsp;(IllegalAccessException&nbsp;e)&nbsp;{&nbsp;&nbsp;</span></li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;</li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">catch&nbsp;(InvocationTargetException&nbsp;e)&nbsp;{&nbsp;&nbsp;</span></li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">"此处接收被调用方法内部未被捕获的异常");&nbsp;&nbsp;</span></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;</li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">catch&nbsp;(InstantiationException&nbsp;e)&nbsp;{&nbsp;&nbsp;</span></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;</li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li> <li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li> <li class="alt">}&nbsp;&nbsp;</li>

</ol></div> <p>输出:</p> <div class="dp-highlighter bg_plain"> <div class="bar">&nbsp;</div> <ol start="1"> <li class="alt">此处接收被调用方法内部未被捕获的异常&nbsp;&nbsp;</li> <li>java.lang.reflect.InvocationTargetException&nbsp;&nbsp;</li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;sun.reflect.NativeMethodAccessorImpl.invoke0(Native&nbsp;Method)&nbsp;&nbsp;</li> <li>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;sun.reflect.NativeMethodAccessorImpl.invoke(Unknown&nbsp;Source)&nbsp;&nbsp;</li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown&nbsp;Source)&nbsp;&nbsp;</li> <li>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;java.lang.reflect.Method.invoke(Unknown&nbsp;Source)&nbsp;&nbsp;</li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.zzj.test.reflect.Test.main(Test.java:11)&nbsp;&nbsp;</li> <li>Caused&nbsp;by:&nbsp;com.zzj.test.reflect.ZeroException:&nbsp;参数不能小于零!&nbsp;&nbsp;</li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.zzj.test.reflect.B.run(Reflect.java:13)&nbsp;&nbsp;</li> <li>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.zzj.test.reflect.Reflect.run(Reflect.java:6)&nbsp;&nbsp;</li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;5&nbsp;more&nbsp;&nbsp;</li>

</ol></div> <p>也可以直接打印目标异常:</p> <div class="dp-highlighter bg_java"> <div class="bar">&nbsp;</div> <ol class="dp-j" start="1"> <li class="alt"><span class="keyword">package&nbsp;com.zzj.test.reflect;&nbsp;&nbsp;</span></li> <li>&nbsp;&nbsp;</li> <li class="alt"><span class="keyword">import&nbsp;java.lang.reflect.InvocationTargetException;&nbsp;&nbsp;</span></li> <li><span class="keyword">import&nbsp;java.lang.reflect.Method;&nbsp;&nbsp;</span></li> <li class="alt">&nbsp;&nbsp;</li> <li><span class="keyword">public&nbsp;<span class="keyword">class&nbsp;Test&nbsp;{&nbsp;&nbsp;</span></span></li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public&nbsp;<span class="keyword">static&nbsp;<span class="keyword">void&nbsp;main(String[]&nbsp;args)&nbsp;{&nbsp;&nbsp;</span></span></span></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">try&nbsp;{&nbsp;&nbsp;</span></li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class&lt;?&gt;&nbsp;clazz&nbsp;=&nbsp;Class.forName(<span class="string">"com.zzj.test.reflect.Reflect");&nbsp;&nbsp;</span></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method&nbsp;method&nbsp;=&nbsp;clazz.getMethod(<span class="string">"run",&nbsp;<span class="keyword">int.<span class="keyword">class);&nbsp;&nbsp;</span></span></span></li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method.invoke(clazz.newInstance(),&nbsp;-<span class="number">1);&nbsp;&nbsp;</span></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">catch&nbsp;(ClassNotFoundException&nbsp;e)&nbsp;{&nbsp;&nbsp;</span></li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;</li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">catch&nbsp;(SecurityException&nbsp;e)&nbsp;{&nbsp;&nbsp;</span></li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;</li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">catch&nbsp;(NoSuchMethodException&nbsp;e)&nbsp;{&nbsp;&nbsp;</span></li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;</li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">catch&nbsp;(IllegalArgumentException&nbsp;e)&nbsp;{&nbsp;&nbsp;</span></li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;</li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">catch&nbsp;(IllegalAccessException&nbsp;e)&nbsp;{&nbsp;&nbsp;</span></li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;</li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">catch&nbsp;(InvocationTargetException&nbsp;e)&nbsp;{&nbsp;&nbsp;</span></li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">"此处接收被调用方法内部未被捕获的异常");&nbsp;&nbsp;</span></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Throwable&nbsp;t&nbsp;=&nbsp;e.getTargetException();<span class="comment">//&nbsp;获取目标异常&nbsp;&nbsp;</span></li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.printStackTrace();&nbsp;&nbsp;</li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">catch&nbsp;(InstantiationException&nbsp;e)&nbsp;{&nbsp;&nbsp;</span></li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;</li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li> <li>}&nbsp;&nbsp;</li>

</ol></div> <p>输出:</p> <div class="dp-highlighter bg_plain"> <div class="bar">&nbsp;</div> <ol start="1"> <li class="alt">此处接收被调用方法内部未被捕获的异常&nbsp;&nbsp;</li> <li>com.zzj.test.reflect.ZeroException:&nbsp;参数不能小于零!&nbsp;&nbsp;</li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.zzj.test.reflect.B.run(Reflect.java:13)&nbsp;&nbsp;</li> <li>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.zzj.test.reflect.Reflect.run(Reflect.java:6)&nbsp;&nbsp;</li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;sun.reflect.NativeMethodAccessorImpl.invoke0(Native&nbsp;Method)&nbsp;&nbsp;</li> <li>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;sun.reflect.NativeMethodAccessorImpl.invoke(Unknown&nbsp;Source)&nbsp;&nbsp;</li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown&nbsp;Source)&nbsp;&nbsp;</li> <li>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;java.lang.reflect.Method.invoke(Unknown&nbsp;Source)&nbsp;&nbsp;</li> <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.zzj.test.reflect.Test.main(Test.java:11)&nbsp;&nbsp;</li> <li></li>

</ol></div></div>

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!