我正在使用ExecutorService
同时运行一些Callables
。这是我的代码的简化版本:
ArrayList<Book> objResults = new ArrayList<Book>();
ExecutorService esrExecutor = Executors.newFixedThreadPool(2);
Set<Callable<ArrayList<Book>>> setCallables = new HashSet<Callable<ArrayList<Book>>>();
setCallables.add(new Callable<ArrayList<Book>>() {
public ArrayList<Book> call() throws Exception {
ArrayList<Book> objAmazonResults = new ArrayList<Book>();
try {
Amazon objAmazon = new Amazon();
objAmazonResults = objAmazon.doSearch(strQuery);
} catch (Exception e) {
e.printStackTrace();
}
return objAmazonResults;
}
});
List<Future<ArrayList<Book>>> lstFutures;
try {
lstFutures = esrExecutor.invokeAll(setCallables);
for(Future<ArrayList<Book>> futFuture : lstFutures){
if (futFuture.get().isEmpty() == false) //NullPointerException occurs here
objResults.addAll(futFuture.get());
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
esrExecutor.shutdown();
我在这段代码NullPointerException
上获得if (futFuture.get().isEmpty() == false)
。我似乎无法弄清楚为什么或如何这些代码可能为空。
如果您查看我的Callable
,您会看到我正在捕获所有异常,只是打印堆栈跟踪,我总是返回new ArrayList<Book>()
。
我在帮助其他人调试我的代码汤方面并不多,但有时候每个人都遇到了障碍,但这种异常教会了我一件事 - 将方法链接在一起时,总是难以调试。
答案 0 :(得分:3)
可能objAmazon.doSearch(strQuery)
返回null吗?
在Callable
。
Future
本身永远不应为null,如果计算以异常终止,Future.get()
将不返回null(因此不需要捕获Callable
内的所有异常)。