抛出异常后继续流程

时间:2019-06-18 01:16:59

标签: java exception try-catch

在我的用例中,我遍历地图并检查列表中是否存在特定键。如果存在,则必须拖曳异常,否则继续执行。

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个键,我想抛出一个异常,它应该继续执行其他代码行剩下的两个。我是否使用错误的设计来实现这一目标?任何帮助或建议,不胜感激!谢谢

4 个答案:

答案 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?错误只是意味着这是一个错误。如果您担心这会导致一些您不知道的错误。您可以使用抛出错误。

无论如何,当程序按您希望的方式运行时,不应使用它