Продолжить поток после броска исключения - PullRequest
2 голосов
/ 18 июня 2019

В моем случае я перебираю карту и проверяю, присутствует ли конкретный ключ в списке.Если он присутствует, то я должен выбросить исключение, в противном случае продолжить выполнение.

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
...
....

В приведенном выше примере, если на карте 3 элемента (myMap), в которых в ключе присутствует 1 ключlist (myList), я хочу сгенерировать исключение для одного, и он должен продолжить выполнение других строк кода для остальных двух.Я использую неправильный дизайн, чтобы достигнуть этого?Любая помощь или предложение приветствуется!Спасибо

Ответы [ 4 ]

3 голосов
/ 18 июня 2019

Как правило, когда вы генерируете исключение, вы говорите, что текущая строка выполнения должна завершаться, а не продолжаться.Если вы хотите продолжить выполнение кода, тогда, возможно, не стоит создавать исключение.

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");
}
2 голосов
/ 26 июня 2019

Вы также можете создать объект исключения в другом месте, из которого вы выбросите его.Эта идиома будет полезна в тех случаях, когда сообщение об исключении не просто «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, но для случаев, когда более интересные данные должны входить в исключениеОбъект, строительство по ходу дела, возможно, стоит рассмотреть.

0 голосов
/ 18 июня 2019

почему бы не использовать if ... else вместо try catch?ошибка просто означает, что это ошибка.если ты боишься, то делает ошибки, чего не знаешь.вы можете использовать throw error.

в любом случае, его не следует использовать, когда программа работает так, как вы хотите

0 голосов
/ 18 июня 2019

Вы можете разделить его на два списка: failList и successList.и сделай это.

Это понятнее

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
        });
...