所以,基本上我有这种代码,重复发生:
for (int i = 0; i < dataFromApi.size(); i++){
try {
returnedPoolData = dataFromApi.get(i).get();
if(returnedPoolData == null || returnedPoolData.getJsonString().isEmpty())
this.processAndStoreData(returnedPoolData, i, calledApis, id, true);
else
this.processAndStoreData(returnedPoolData, i, calledApis, id, false);
} catch (ExecutionException e){
log.info("" + e);
this.processAndStoreData(returnedPoolData, i, calledApis, id, true);
}
}
我想通过抛出一个IllegalArgumentException
并立即捕获它来避免重复。
所以代码看起来像:
for (int i = 0; i < dataFromApi.size(); i++){
try {
returnedPoolData = dataFromApi.get(i).get();
if(returnedPoolData == null || returnedPoolData.getJsonString().isEmpty())
throw new IllegalArgumentException("Returned data was empty.");
else
this.processAndStoreData(returnedPoolData, i, calledApis, id, false);
} catch (ExecutionException e){
log.info("" + e);
this.processAndStoreData(returnedPoolData, i, calledApis, id, true);
}
}
那会有用吗?因为我删除ExecutionException
时throw new
行没有以红色下划线...
答案 0 :(得分:1)
IllegalArgumentException
是运行时异常
因此编译器不会限制您处理它
我想补充一点,ExecutionException
catch
语句对处理IllegalArgumentException
投掷没有帮助:
catch (ExecutionException e){
log.info("" + e);
this.processAndStoreData(returnedPoolData, i, calledApis, id, true);
}
因为IllegalArgumentException
不是ExecutionException
的子类
要捕获这两个异常,您可以编写一个catch语句,例如:
catch (ExecutionException | IllegalArgumentException e){
...
}
除了正确捕获异常之外,我还要补充一点,抛出一个异常来捕获它在同一个方法中并不一定能很好地利用异常。
避免三次重复调用的另一种方法是使用布尔值,例如:
for (int i = 0; i < dataFromApi.size(); i++) {
boolean isErrorCase = false;
try {
returnedPoolData = dataFromApi.get(i).get();
if (returnedPoolData == null || returnedPoolData.getJsonString().isEmpty()) {
isErrorCase = true;
}
} catch (ExecutionException e) {
log.info("" + e);
isErrorCase = true;
}
this.processAndStoreData(returnedPoolData, i, calledApis, id, isErrorCase);
}
答案 1 :(得分:0)
我认为你应该在返回的数据为null时抛出。但是当你不打算或不能处理它时,你也不应该捕获异常。
因此,如果您只是想记录错误并继续向现有的catch子句添加IllegalArgumentException
或添加另一个catch子句来处理此类异常。
否则,如果您无法在此处理,请将其传播。
如果抛出IllegalArgumentException
,catch(ExecutionException){...}
将无法捕获它,因为
IllegalArgumentException
不会ExecutionException
。
答案 2 :(得分:0)
您可以使用
for (int i = 0; i < dataFromApi.size(); i++){
returnedPoolData = null;
try {
returnedPoolData = dataFromApi.get(i).get();
} catch (ExecutionException e){
log.info("err:", e);
}
if(returnedPoolData == null || returnedPoolData.getJsonString().isEmpty()) {
this.processAndStoreData(returnedPoolData, i, calledApis, id, true);
}
else {
this.processAndStoreData(returnedPoolData, i, calledApis, id, false);
}
}