全部产品
云市场

java_lang_reflect_InvocationTargetException

更新时间:2018-04-19 17:13:30

问题分析:

InvocationTargetException异常由Method.invoke(obj, args…)方法抛出。当被调用的方法的内部抛出了异常而没有被捕获时,由此异常接收。

解决方案:

在反射调用方法时,被调用的方法内部抛出了异常没有被捕获会抛出此类异常,建议使用try Catch块进行捕获并处理。

代码示例:

  1. public static void main(String[] args) {
  2. try {
  3. Class<?> clazz = Class.forName("com.alibaba.test");
  4. Method method = clazz.getMethod("run", int.class);
  5. method.invoke(clazz.newInstance(), -1);
  6. } catch (InvocationTargetException e) {
  7. System.out.println("此处接收被调用方法内部未被捕获的异常");
  8. e.printStackTrace();
  9. }
  10. }

详细的例子:

  1. java.lang.reflect.InvocationTargetException
  2. at java.lang.reflect.Method.invokeNative(Native Method)
  3. at java.lang.reflect.Method.invoke(Method.java:515)
  4. at android.app.ActivityThread.pauseGC(ActivityThread.java:5525)
  5. at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2324)
  6. at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2471)
  7. at android.app.ActivityThread.access$900(ActivityThread.java:175)
  8. at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1308)
  9. at android.os.Handler.dispatchMessage(Handler.java:102)
  10. at android.os.Looper.loop(Looper.java:146)
  11. at android.app.ActivityThread.main(ActivityThread.java:5602)
  12. at java.lang.reflect.Method.invokeNative(Native Method)
  13. at java.lang.reflect.Method.invoke(Method.java:515)
  14. at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
  15. at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
  16. at dalvik.system.NativeStart.main(Native Method)
  17. Caused by: java.lang.UnsatisfiedLinkError: Native method not found: dalvik.system.VMRuntime.pauseGc:(Ljava/lang/String;)I
  18. at dalvik.system.VMRuntime.pauseGc(Native Method)
  19. ... 15 more

针对这个异常的堆栈信息来看,暂时没有好的解决方案,这个问题是三星Android4.4.2、4.4.4版本引入的bug,原因是:在ActivityThread文件的第5525行调用反射调用native方法pauseGc()而未找到此函数。每当视频重绘调用GLSurfaceView时,会起一个新的Activity会产生2MB的垃圾,但GC机制没有对此进行垃圾回收。因此如果播放一个视频30min左右内存就满了,应用Crash产生。

参考文献:

1.http://developer.samsung.com/forum/thread/pause-gc-error-post-android-442-upgrade-on-samsung-galaxy-note-ii/201/266242?boardName=SDK&startId=zzzzz~&searchSubId=0000000029

2.https://docs.oracle.com/javase/7/docs/api/java/lang/reflect/InvocationTargetException.html