В фрагменте кода, над которым я сейчас работаю, я беру ArrayList данных, которые нужно добавить к объекту, от пользователя. Я сверяю каждый элемент в ArrayList с текущим списком данных этого типа для объекта, чтобы убедиться, что его еще нет в списке.
Есть ли способ создать исключение для одного элемента в переданном списке, чтобы сообщить пользователю, что он уже находится в списке, а затем продолжить работу и добавить следующие элементы в переданном списке в мой текущий список, если они разве там уже нет?
@JimGarrison OP пытается исключить бросать, не прерывая метод.
Нет, вы не можете этого сделать, выброс исключения принудительно завершает выполнение вашего кода. Вам нужно разобраться с каким-то возвращаемым значением для этого метода.
@shmosel Перехват исключения внутри цикла позволяет восстановить метод, не прерывая его. Я не понимаю, о чем вы.
@JimGarrison Обычно бессмысленно ловить исключение, если вы его бросаете.
Не совсем, иногда это может быть полезно. Однако использование исключений для того, что должно быть управлением потоком из-за лени (не утруждать себя проверкой, пусть какой-то код выдает недопустимые данные), определенно плохой запах кода.




Обновление: я решил проблему, окружив этот блок кода командой 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!
Это хорошее кодирование? или есть способ лучше, чем то, как я это сделал?
Нет, это плохой код. Нет смысла генерировать исключение, чтобы сразу его поймать. Если вы хотите распечатать сообщение об ошибке, просто сделайте это. Во-первых, вам не нужно исключение.
Это то, что я собирался сделать изначально, но, видимо, вы не должны печатать сообщения об ошибках (используя System.out.println ()) из своего класса, по крайней мере, согласно моему учителю программирования. Я согласен с тем, что это имеет смысл, но из того, что я слышал, похоже, что это плохое кодирование. Пожалуйста, объясните мне, правильный ли это способ делать что-то, потому что он сделал бы мою жизнь НАСТОЛЬКО легче.
В любом случае это то, что вы делаете.
Короткий ответ: да, вы можете это сделать, но обычно это крайне не рекомендуется.
Пример псевдокода:
for (Item i : inputList)
{
try
{
myObject.addItem(i);
}
catch (MyCustomDuplicateItemException ex)
{
// Tell the user there was a duplicate
}
}
Однако здесь используются исключения для того, что должно быть управлением потоком. В идеале вы должны написать метод addItem(), чтобы возвращать логическое значение (например, true), если элемент был успешно добавлен, и другое значение (false), если элемент является дубликатом и НЕ генерирует исключение.
а) Покажите свой код; б) Конечно, просто перехватите исключение внутри цикла и продолжайте. Пожалуйста, прочтите несколько базовых руководств по исключениям и обработке исключений.