我有以下代码。我想知道在多线程环境中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);
}
}
我真的找不到任何例外。任何帮助都非常感谢。
答案 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()
方法。
也可能有其他可能性。
如果您只是对可能的例外情况感到好奇,那么上述内容或多或少都会涵盖它。
如果你想整理这段代码,那么在那时抓住Exception
可能是件坏事。列出的每个案例都是此处或应用程序中其他位置的错误信号。相反,在那一点捕获异常并且(可能)试图“改善”问题,最好用堆栈跟踪炸弹,然后返回并修复正在出现的根本问题隐藏在渔获之中。
答案 2 :(得分:0)
两个操作可能会引发异常:
o.hashCode()
可以抛出RuntimeException
。iter.next()
也可以抛出RuntimeException
,例如ConcurrentModificationException
。请记住,从RuntimeException
派生的任何内容都是未经检查的异常,不需要在throws
子句中声明。
P.S。你为什么还在使用Vector
而不是ArrayList
?
答案 3 :(得分:-2)
没有例外。 Vector是线程安全的类,所以不要担心多线程环境