Выброс исключения и продолжение приема данных

В фрагменте кода, над которым я сейчас работаю, я беру ArrayList данных, которые нужно добавить к объекту, от пользователя. Я сверяю каждый элемент в ArrayList с текущим списком данных этого типа для объекта, чтобы убедиться, что его еще нет в списке.

Есть ли способ создать исключение для одного элемента в переданном списке, чтобы сообщить пользователю, что он уже находится в списке, а затем продолжить работу и добавить следующие элементы в переданном списке в мой текущий список, если они разве там уже нет?

а) Покажите свой код; б) Конечно, просто перехватите исключение внутри цикла и продолжайте. Пожалуйста, прочтите несколько базовых руководств по исключениям и обработке исключений.

Jim Garrison 10.06.2018 06:08

@JimGarrison OP пытается исключить бросать, не прерывая метод.

shmosel 10.06.2018 07:12

Нет, вы не можете этого сделать, выброс исключения принудительно завершает выполнение вашего кода. Вам нужно разобраться с каким-то возвращаемым значением для этого метода.

Joakim Danielson 10.06.2018 07:15

@shmosel Перехват исключения внутри цикла позволяет восстановить метод, не прерывая его. Я не понимаю, о чем вы.

Jim Garrison 10.06.2018 07:17

@JimGarrison Обычно бессмысленно ловить исключение, если вы его бросаете.

shmosel 10.06.2018 07:18

Не совсем, иногда это может быть полезно. Однако использование исключений для того, что должно быть управлением потоком из-за лени (не утруждать себя проверкой, пусть какой-то код выдает недопустимые данные), определенно плохой запах кода.

Jim Garrison 10.06.2018 07:20
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
6
46
2

Ответы 2

Обновление: я решил проблему, окружив этот блок кода командой try / catch. Вот мой код для пояснения:

    public void addCategories(ArrayList<BookCategory>categories) {
    boolean exists;

    for(int index = 0; index <categories.size(); index++) {//iterate through passed array list
    try {   
        //for each element, check if it exists in the current category list.
        exists = checkBookCategory(categories.get(index));
        if (exists == false)
        {subjectCategories.add(categories.get(index));}
        else {
     throw new IllegalArgumentException("Item " + categories.get(index) + " already in list.");         }
    }catch(IllegalArgumentException ie) {
        System.out.println(ie);
    }   }
}

Спасибо, @JimGarrison!

Это хорошее кодирование? или есть способ лучше, чем то, как я это сделал?

user9791370 10.06.2018 07:27

Нет, это плохой код. Нет смысла генерировать исключение, чтобы сразу его поймать. Если вы хотите распечатать сообщение об ошибке, просто сделайте это. Во-первых, вам не нужно исключение.

shmosel 10.06.2018 12:38

Это то, что я собирался сделать изначально, но, видимо, вы не должны печатать сообщения об ошибках (используя System.out.println ()) из своего класса, по крайней мере, согласно моему учителю программирования. Я согласен с тем, что это имеет смысл, но из того, что я слышал, похоже, что это плохое кодирование. Пожалуйста, объясните мне, правильный ли это способ делать что-то, потому что он сделал бы мою жизнь НАСТОЛЬКО легче.

user9791370 10.06.2018 17:31

В любом случае это то, что вы делаете.

shmosel 10.06.2018 19:42

Короткий ответ: да, вы можете это сделать, но обычно это крайне не рекомендуется.

Пример псевдокода:

for (Item i : inputList)
{
    try
    {
        myObject.addItem(i);
    } 
    catch (MyCustomDuplicateItemException ex)
    {
        // Tell the user there was a duplicate
    }
}

Однако здесь используются исключения для того, что должно быть управлением потоком. В идеале вы должны написать метод addItem(), чтобы возвращать логическое значение (например, true), если элемент был успешно добавлен, и другое значение (false), если элемент является дубликатом и НЕ генерирует исключение.

Другие вопросы по теме