Исключения в Java с векторами и итераторами - PullRequest
0 голосов
/ 02 декабря 2011

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

class Goo
{
private Vector objects = new Vector();

public void kempute ()
{
    Iterator iter = objects.iterator();
    while (iter.hasNext()) {
        try {
            Object o = (Object)iter.next();
            System.out.println(o.hashCode());
        }
        catch (Exception ex) {
            //
        }
    }
}

public void addme (Object o)
{
    objects.add(o);
}
}

Я действительно не смог найти никаких исключений. Любая помощь очень ценится.

Ответы [ 4 ]

0 голосов
/ 02 декабря 2011

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

0 голосов
/ 02 декабря 2011

В этот момент может быть обнаружено исключение, если

Object o = (Object)iter.next();

или

System.out.println(o.hashCode());

сгенерирует непроверенное исключение.Вот несколько возможностей:

  • Если вы ранее вызывали addObject(null), вызов update() привел бы к исключению NullPointerException, когда он вызывает hashCode() на nullссылка.

  • Если у вас есть экземпляр Foo, совместно используемый двумя потоками, и один вызывает addObject, а другой вызывает compute(), тогда вы можете получить ConcurrentModificationException.

  • Если Vector был пользовательским классом, а не java.util.Vector, то iter.next() может вызвать другое неконтролируемое исключение ... по желанию автора указанного пользовательского класса.(ОК ... маловероятно в свете комментариев ОП.)

  • (из ответа Экс) - o.hashCode() теоретически может выдать любое непроверенное исключение, в зависимости от того, как oКласс реализует метод hashCode().

  • Могут быть и другие возможности.


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

Если вы хотите привести в порядок этот код, то, вероятно, плохо поймать Exception в этот момент.Каждый из перечисленных случаев является признаком ошибки здесь или в другом месте приложения.Вместо того, чтобы поймать исключение в этот момент и (предположительно) попытаться «исправить» проблему, лучше выполнить бомбардировку с помощью трассировки стека, а затем вернуться назад и исправить скрытую корневую проблемууловом.

0 голосов
/ 02 декабря 2011

Две операции могут потенциально вызвать исключение:

  1. o.hashCode() может выдать RuntimeException.
  2. iter.next() также может выдать RuntimeException, например ConcurrentModificationException.

Помните, что все, что получено из RuntimeException, является непроверенным исключением и не требует объявления в предложении throws.

PSиспользуя Vector, а не, скажем, ArrayList?

0 голосов
/ 02 декабря 2011

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

С Vector JavaDoc:

Итераторы, возвращаемые итераторами этого класса и listIterator Методы fail-fast : если вектор структурно модифицирован в любом время после создания итератора, любым способом, кроме как через собственные методы удаления или добавления итератора, итератор выдаст ConcurrentModificationException . Таким образом, перед лицом одновременного модификации, итератор дает сбой быстро и чисто риск произвольного, недетерминированного поведения в неопределенное время в будущем. Перечисления, возвращаемые методом elements не неудачно-быстро.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...