带有向量和迭代器的java中的异常

时间:2011-12-02 11:30:09

标签: java multithreading exception vector iterator

我有以下代码。我想知道在多线程环境中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 :(得分:0)

您的代码可能会在多线程环境中抛出ConcurrentModificationException,其中一个或多个线程可能会从列表中添加或删除元素,而其他线程可能会同时迭代它。

来自Vector JavaDoc:

  

此类的迭代器 listIterator 返回的迭代器   方法是快速失败:如果向量在任何结构上进行了修改   创建迭代器之后的时间,除了通过之外的任何方式   迭代器自己删除或添加方法,迭代器会抛出一个   的 ConcurrentModificationException的即可。因此,面对并发   修改,迭代器快速而干净地失败,而不是   在不确定的时间冒着任意的,非确定性的行为   在将来。 elements方法返回的Enumerations是   不是快速失败。

答案 1 :(得分:0)

如果

,可以在此时捕获异常
Object o = (Object)iter.next();

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

抛出未经检查的异常。以下是几种可能性:

  • 如果之前曾调用addObject(null),则在update()引用上调用hashCode()时,对null的调用将导致NullPointerException。

  • 如果您有两个线程共享Foo的实例,而另一个调用addObject而另一个调用compute(),那么您可以获得ConcurrentModificationException }。

  • 如果Vector是自定义类而不是java.util.Vector,那么iter.next()可能会抛出一些其他未经检查的异常......按照所述自定义类的作者的心血来潮。 (好的......根据OP的评论不太可能。)

  • (来自aix的回答) - o.hashCode()理论上可以抛出任何未经检查的异常,具体取决于o的类如何实现hashCode()方法。

    < / LI>
  • 也可能有其他可能性。


如果您只是对可能的例外情况感到好奇,那么上述内容或多或少都会涵盖它。

如果你想整理这段代码,那么在那时抓住Exception可能是件坏事。列出的每个案例都是此处或应用程序中其他位置的错误信号。相反,在那一点捕获异常并且(可能)试图“改善”问题,最好用堆栈跟踪炸弹,然后返回并修复正在出现的根本问题隐藏在渔获之中。

答案 2 :(得分:0)

两个操作可能会引发异常:

  1. o.hashCode()可以抛出RuntimeException
  2. iter.next()也可以抛出RuntimeException,例如ConcurrentModificationException
  3. 请记住,从RuntimeException派生的任何内容都是未经检查的异常,不需要在throws子句中声明。

    P.S。你为什么还在使用Vector而不是ArrayList

答案 3 :(得分:-2)

没有例外。 Vector是线程安全的类,所以不要担心多线程环境