问题分析
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产生。
参考文献
文档内容是否对您有帮助?