为什么从Futures获取值时会出现NullPointerException?

时间:2012-11-27 12:42:22

标签: java nullpointerexception executorservice callable

我正在使用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>()

我在帮助其他人调试我的代码汤方面并不多,但有时候每个人都遇到了障碍,但这种异常教会了我一件事 - 将方法链接在一起时,总是难以调试。

1 个答案:

答案 0 :(得分:3)

可能objAmazon.doSearch(strQuery)返回null吗? 在Callable

中插入支票

Future本身永远不应为null,如果计算以异常终止,Future.get()将不返回null(因此不需要捕获Callable内的所有异常)。