java_lang_reflect_InvocationTargetException

问题分析

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

解决方案

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

代码示例

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

详细的例子:

java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at android.app.ActivityThread.pauseGC(ActivityThread.java:5525)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2324)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2471)
    at android.app.ActivityThread.access$900(ActivityThread.java:175)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1308)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:146)
    at android.app.ActivityThread.main(ActivityThread.java:5602)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.UnsatisfiedLinkError: Native method not found: dalvik.system.VMRuntime.pauseGc:(Ljava/lang/String;)I
    at dalvik.system.VMRuntime.pauseGc(Native Method)
    ... 15 more

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

参考文献