在项目中发现一个情况,线程中一段很快的代码突然变得非常的慢,打log调试发现顺序代码运行到一半就退出。最后发现原因来自于如下代码段:
private <T> T executeAndWait(Callable<T> callable) { FutureTask<T> task = new FutureTask<T>(callable); mMainHandler.sendMessage( mMainHandler.obtainMessage(MSG_RUN_OBJECT, task)); try { return task.get(); } catch (InterruptedException e) { Log.w(TAG,"executeAndWait: "+e); } catch (ExecutionException e) { //throw new RuntimeException(e); Log.w(TAG,"executeAndWait: "+e); } return null; }
代码运行到一半异常退出只有一个情况,那就是线程异常退出了,所以我找到了线程启动的地方,发现这里有一个陌生的ExecutionException,打出相应的log,果然是这里catch了线程异常
W/AllItemDataLoader(19548): executeAndWait: java.util.concurrent.ExecutionException: java.lang.NullPointerException: Attempt to read from field 'com.android.gallery3d.glrenderer.BitmapTexture com.android.gallery3d.vivo.AllItemSldingWindow$SlotEntry.labelTexture' on a null object reference
该异常的定义如下:
Exception thrown when attempting to retrieve the result of a task that aborted by throwing an exception
task本身崩溃抛出的异常,也就是说上述代码中Callable参数任务中抛出的任何异常都会在这里捕获抛出ExecutionException异常。
因此解决这个异常的办法就是解决task中自身的异常,这里是空指针异常,找到task中可能调用到SlotEntry.labtexture的地方调试是否有空指针的情况即可。