Ваша функция имеет ряд недостатков.
- Вы делаете контрольная проверка равенства, а не проверка равенства значений. Для выполнения проверки равенства значений всегда используйте метод «equals». Вы не получите ошибок компилятора для такого рода недостатков. нежелательный выход.
- Не все потоки управления в вашей функции имеют оператор возврата, даже если ваша сигнатура метода предлагает непрямой оператор возврата. Это приведет к ошибке компилятора, которую вы видите в коде.
- У вас есть несколько операторов возврата. Это не ошибка компилятора и ошибка времени выполнения. Однако с точки зрения хорошей практики программирования, это не лучшая идея иметь несколько операторов возврата. Вы можете сделать оператор возврата на основе флага в самом конце.
- Вы удаляете элементы из объекта коллекции, итерации через него. В зависимости от типа используемого объекта коллекции он может вызывать исключение ConcurrentModificationException во время выполнения. Вместо этого вам нужно использовать отказобезопасный итератор, если он доступен.
Я попытался исправить вашу программу. См., Если это имеет смысл:
public boolean deleteItem(String p) {
boolean itemFound = false;
//Assuming your myList object returns a fail safe iterator.
//If it returns a fail fast iterator instead, see the next option.
Iterator<String> iter = this.myList.iterator();
while(iter.hasNext()){
if(iter.next().equals(p)) {
iter.remove();
itemFound=true;
}
}
return itemFound;
}
Вышеупомянутая программа будет работать, если итератор отказоустойчив. Например. если ваш объект myList имеет тип CopyOnWriteArrayList, его итератор будет отказоустойчив. Но если ваш объект myList имеет тип такой простой ArrayList, который возвращает быстрый итератор с ошибкой, вышеупомянутый метод даст вам CME.
Если ваш объект коллекции MyList представляет список типа, вы можете попробовать что-то же просто, как:
public boolean deleteItem(String p) {
//removeAll will return true if at least 1 element is removed
return this.myList.removeAll(Collections.singletonList(p));
}
С другой стороны, если вы используете Java 8, вы можете сделать что-то вроде следующего:
public boolean deleteItem(String p) {
//removeIf will return true if at least 1 element is removed
return this.myList.removeIf(item -> item != null && item.equals(p));
}
Надеюсь, вам это поможет.
Удалите блок else и переместите 'return false;' вне цикла for. –
Что сказал @John, а также использовать '.equals()' для сравнения строк (а не '=='). – Bohemian
Используйте * отладчик *. Мы не ваш отладчик. Если вы пройдете через код, вы сразу увидите свою ошибку. – Andreas