Java 为什么我在从期货中获取值时会得到NullPointerException?
我正在使用andJava 为什么我在从期货中获取值时会得到NullPointerException?,java,nullpointerexception,executorservice,callable,Java,Nullpointerexception,Executorservice,Callable,我正在使用andExecutorService来同时运行一些可调用项。以下是我的代码的简化版本: ArrayList<Book> objResults = new ArrayList<Book>(); ExecutorService esrExecutor = Executors.newFixedThreadPool(2); Set<Callable<ArrayList<Book>>> setCallables = new HashSe
ExecutorService
来同时运行一些可调用项
。以下是我的代码的简化版本:
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();
ArrayList objResults=new ArrayList();
ExecutorService ESR Executor=Executors.newFixedThreadPool(2);
Set setCallables=new HashSet();
setCallables.add(newcallable()){
公共ArrayList调用()引发异常{
ArrayList objAmazonResults=新的ArrayList();
试试{
Amazon objAmazon=新亚马逊();
objAmazonResults=objAmazon.doSearch(strQuery);
}捕获(例外e){
e、 printStackTrace();
}
返回结果;
}
});
上市期货;
试一试{
lstFutures=esrExecutor.invokeAll(setCallables);
for(未来:LST未来){
if(futfourture.get().isEmpty()==false)//此处发生NullPointerException
objResults.addAll(futfourture.get());
}
}捕捉(中断异常e){
e、 printStackTrace();
}捕获(执行例外){
e、 printStackTrace();
}
ESR执行器关闭();
如果(futfourture.get().isEmpty()==false),我在这段代码上得到一个NullPointerException
。我似乎不明白这段代码为什么或如何可能为空
如果查看我的Callable
,您会发现我捕获了所有异常,只需打印stacktrace,我总是返回new ArrayList()
我不太愿意帮助别人调试我的代码汤,但有时每个人都会遇到障碍,但这种异常教会了我一件事——将方法链接在一起时,调试总是比较困难。可能是
objAmazon.doSearch(strQuery)
返回null?
在可调用的
中插入对此的检查
如果计算因异常而终止,
Future
本身不应为null,Future.get()
将不会返回null(因此无需捕获可调用的中的所有异常)。objAmazonResults=objAmazon.doSearch(strQuery)
可能会用null
覆盖它。除了Phillip所说的,call()将抛出null,因为它保存了线程必须执行的代码。添加try catch和print stack trace inside call()方法以查找异常位置。