Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我在从期货中获取值时会得到NullPointerException?_Java_Nullpointerexception_Executorservice_Callable - Fatal编程技术网

Java 为什么我在从期货中获取值时会得到NullPointerException?

Java 为什么我在从期货中获取值时会得到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

我正在使用and
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()方法以查找异常位置。