在我的用例中,我遍历地图并检查列表中是否存在特定键。如果存在,则必须拖曳异常,否则继续执行。
Map<A,B> myMap = new HashMap<A,B>();
//code to populate values in myMap
...
...
List<A> myList = new ArrayList<A>();
//code to populate values in myList
...
...
for(Map.Entry<A,B> eachElementInMap:myMap.entrySet()){
if(myList.contains(eachElementInMap:myMap.getKey())){
//throwing exception
throw new MyCustomizedException("someString");
}
}
//code continues
...
....
在上面的示例中,如果map(myMap)中有3个元素,其中list(myList)中存在1个键,我想抛出一个异常,它应该继续执行其他代码行剩下的两个。我是否使用错误的设计来实现这一目标?任何帮助或建议,不胜感激!谢谢
答案 0 :(得分:3)
通常,一旦引发异常,您就是说当前执行行应该终止而不是继续。如果您想继续执行代码,则可以推迟引发异常。
boolean fail = false;
for (Map.Entry<A,B> eachElementInMap:myMap.entrySet()) {
if (myList.contains(eachElementInMap:myMap.getKey())) {
// throw an exception later
fail = true;
}
}
if (fail) {
throw new MyCustomizedException("someString");
}
答案 1 :(得分:2)
您还可以创建一个异常对象,该对象与您抛出的位置不同。在异常消息不仅是“ someString”,而且还需要从从被迭代的对象获得的数据构造异常消息的情况下,这种惯用法很有用。
Optional<MyCustomizedException> exception = Optional.empty();
for (Map.Entry<A, B> eachElementInMap:myMap.entrySet()) {
if (myList.contains(eachElementInMap.getKey())) {
// Create an exception object that describes e.g., the missing key(s)
// but do not throw it yet.
if( exception.isPresent() ) {
exception.get().addToDescription( /* Context-sensitive information */ );
}
else {
exception = Optional.of(
new MyCustomizedException( /* Context-sensitive information */));
}
}
}
if( exception.isPresent() ) {
throw exception.get();
}
如果异常中存储的唯一数据是字符串,则可以通过在StringBuilder
中累积问题描述来达到等效的效果,但是对于需要将更多有趣数据放入异常对象的情况,你去也许是一个值得考虑的选择。
答案 2 :(得分:0)
您可以将其分为两个列表,失败列表和成功列表。并做。
这更清楚
failList = myMap.entrySet().stream().filter(p->myList.contains(p.getKey())).collect(Collectors.toList());
successList = myMap.entrySet().stream().filter(p->!myList.contains(p.getKey())).collect(Collectors.toList());
failList.forEach(p -> {
// fail code
});
successList .forEach(p -> {
// success code
});
答案 3 :(得分:0)
为什么不使用if ... else而不是try catch?错误只是意味着这是一个错误。如果您担心这会导致一些您不知道的错误。您可以使用抛出错误。
无论如何,当程序按您希望的方式运行时,不应使用它