有一种方法for (int i = 0; i < responseArrayList.count; i++) {
postArrayList = [[responseArrayList objectAtIndex:i] valueForKey:@"post"];
for (int j = 0; j < postArrayList.count; j++) {
return postArrayList.count;
}
}
(我不能修改它)。此方法返回MyObjects,它必须位于try catch块中,因为get(sql)
可能存在。我的代码是:
JqlParseException
我想删除try catch并使用String sql = something;
try{
MyObject object = get(sql);
} catch(JqlParseException e){
e.printStackTrace();
} catch(RuntimeException e){
e.printStackTrace();
}
类,我试过:
Optional
但IDE强制尝试捕获。 并为:
MyObject object = Optional.ofNullable(get(sql)).orElseThrow(RuntimeException::new);
是一个错误(在IDE中)MyObject object = Optional.ofNullable(get(sql)).orElseThrow(JqlParseException::new));
。有没有办法避免尝试catch块并使用可选的?
答案 0 :(得分:34)
Optional
并非真正用于处理异常的目的,它旨在处理潜在的空值而不会破坏程序的流程。例如:
myOptional.map(Integer::parseInt).orElseThrow(() -> new RuntimeException("No data!");
如果可选项为空,则会自动跳过map
步骤,直接进入throw
步骤 - 一个不错的完整程序流程。
当你写:
myOptionalValue.orElseThrow(() -> new RuntimeException("Unavailable"));
...你真正说的是:返回我的可选值,但如果它不可用则抛出异常。
您似乎想要的是一种创建可选项(立即捕获异常)的方法,并在您尝试使用可选项时重新抛出该异常。
答案 1 :(得分:8)
这不是Optionals的工作方式。它们不会使try-catch-blocks过时。但是,您可以引入一个新的包装函数,如下所示:
public Optional<MyObject> getMyObject(final String jql) {
try {
return Optional.ofNullable(get(sql));
} catch (final JqlParseException e) {
return Optional.empty();
}
}
您将不再需要处理异常,但如果您获得一个空的Optional,则不会知道是否有错误。
答案 2 :(得分:1)
试试这个
Optional.ofNullable(result)
.orElseThrow(() -> new GenericClientException("Request body is not valid", HttpStatus.BAD_REQUEST));