关于处理以下代码中的异常:
ListenableFuture<BufferedImage> imgFuture = downloadExecutor
.submit(new Downloader(url));
ListenableFuture<BufferedImage> resizeFuture = Futures.transformAsync(
imgFuture, new AsyncFunction<BufferedImage, BufferedImage>()
{
@Override
public ListenableFuture<BufferedImage> apply(
BufferedImage input) throws Exception
{
ListenableFuture<BufferedImage> resizedFuture = null;
if (input != null)
{
resizedFuture = actionExecutor
.submit(new ResizeImageAction(input));
}
return resizedFuture;
}
});
ListenableFuture<BufferedImage> grayFuture = Futures
.transformAsync(resizeFuture, input -> {
return actionExecutor
.submit(new ToGrayImageAction(input));
});
假设每个与执行程序相关的动作都可以引发异常,该代码将如何表现。
transformAsync()
方法是否知道不会引发异常或引发异常的期货?使用CheckedFuture
会帮助我吗?如果是这样,我应该如何使用它?
感谢!!!!
答案 0 :(得分:2)
它知道抛出的异常,但不知道null,因为它是完全合法的值。如果在第一个ListenableFuture
中抛出异常,那么它将被传播到所有变换器:它们的onFailure
回调将被调用,但不会被调用(因为没有变换值)。 / p>
Javadoc到transformAsync
:
@return保存函数结果的未来(如果输入成功)或原始输入失败(如果没有)
简单示例:
ListenableFuture<Integer> nullFuture = executor.submit(() -> null);
ListenableFuture<Integer> exceptionFuture = executor.submit(() -> {
throw new RuntimeException();
});
// Replace first argument with exceptionFuture to get another result
ListenableFuture<Integer> transformer = Futures.transformAsync(nullFuture, i -> {
System.out.println(i);
return Futures.immediateCheckedFuture(1);
}, executor);
Futures.addCallback(transformer, new FutureCallback<Integer>() {
@Override
public void onSuccess(Integer result) {
System.out.println(result);
}
@Override
public void onFailure(Throwable t) {
System.out.println(t);
}
});
对于nullFuture
“null,将打印1”,而对于exceptionFuture
,仅打印“java.lang.RuntimeException”,因为异常传播到其变换器。