Поскольку отказоустойчивое поведение итератора не гарантируется.
Вы получаете это исключение, потому что вы
Плохо:
// we're using iterator
for (Iterator i = c.iterator(); i.hasNext();) {
// here, the collection will check it hasn't been modified (in effort to fail fast)
String s = i.next();
if(s.equals("lalala")) {
// s is removed from the collection and the collection will take note it was modified
c.remove(s);
}
}
Хорошо:
// we're using iterator
for (Iterator i = c.iterator(); i.hasNext();) {
// here, the collection will check it hasn't been modified (in effort to fail fast)
String s = i.next();
if(s.equals("lalala")) {
// s is removed from the collection through iterator, so the iterator knows the collection changed and can resume the iteration
i.remove();
}
}
Теперь, чтобы перейти к следующему элементу, «почему»: в приведенном выше коде обратите внимание на то, как выполняется проверка модификации - удаление помещает коллекцию как измененную, а следующая итерация проверяет любые изменения и терпит неудачу, если она обнаруживает изменение коллекции. Еще одна важная вещь: ArrayList
(не уверенный в других сборниках) делает not проверкой на модификацию в hasNext()
.
Поэтому могут произойти две странные вещи:
ArrayList.hasNext()
будет также возвращать false
, потому что итератор current index
теперь указывает на последний элемент (бывший второй по-последнему). Таким образом, даже в этом случае после удаления нет «следующего» элемента Обратите внимание, что все это соответствует документации ArrayList :
Обратите внимание, что неэффективное поведение итератора не может быть гарантировано, поскольку, как правило, невозможно сделать какие-либо серьезные гарантии при наличии несинхронизированной параллельной модификации. Неуправляемые итераторы бросают ConcurrentModificationException с максимальной эффективностью. Поэтому было бы неправильно писать программу, зависящую от этого исключения, за ее правильность: неудачное поведение итераторов должно использоваться только для обнаружения ошибок.
blockquote>Отредактировано для добавления:
Этот вопрос дает некоторую информацию о том, почему проверка параллельной модификации не выполнена в
]hasNext()
и выполняется только вnext()
.
Короткий ответ: вы не можете - он контролируется браузером.
Длинный ответ: вы можете переопределить его, используя некоторые хаки CSS .
Кнопка «Обзор» является частью загружаемого виджета и обычно соответствует языковым настройкам браузера пользователя. Вы можете полностью заменить его некоторыми js / ajax-y thingy, но я не вижу смысла.