为什么我的代码似乎绕过了这个异常?
问题描述:
鉴于这种代码:为什么我的代码似乎绕过了这个异常?
public class TwoThreads {
static Thread laurel, hardy;
public static void main(String[] args) {
laurel = new Thread() {
public void run() {
System.out.println("A");
try {
hardy.sleep(1000);
} catch (Exception e) {
System.out.println("B");
}
System.out.println("C");
}
};
hardy = new Thread() {
public void run() {
System.out.println("D");
try {
laurel.wait();
} catch (Exception e) {
System.out.println("E");
}
System.out.println("F");
}
};
laurel.start();
hardy.start();
}
}
输出包括:
A C D E and F
我疑惑为什么飞机包括F,因为在等待()被调用的码外的IllegalMonitorStateException
抛出。为什么F的打印语句达到了?我相信线程堆栈会随之而来,但是程序应该将控制权交给主堆栈。
这是正确的吗?
答
您正在捕获打印“E”的块的异常,从而有效地吞咽它。代码将继续打印“F”。因为这个原因,简单地捕捉异常并且不做其他事情的块是危险的。
答
您捕获异常,所以控制进入catch块,然后在try/catch后继续执行代码。
答
在上面的代码中,只要在打印“D”后它们是非应用程序致命错误,在处理所有可捕获错误时总会打印“F”。
如果没有线程挂起,则此行为将保持一致。
将一个布尔检查添加到“F”,如果抛出错误并且会给出所需的行为,则该检查被抑制。
答
作为一个方面说明,您可以在对象上调用Thread的静态sleep
方法,该方法除了您所期望的以外还可以做其他事情。出于这个原因,您不应该在实例上调用静态类方法。
(至于为什么F的印刷,其他人是正确的)
答
我不知道你是怎么知道IllegalMonitorStateException
被抛出。您正在使用任何Exception
而不是执行诸如e.printStackTrace();
之类的操作。
+1绝对正确,如果你想捕捉异常时打印到日志,请确保你用throw抛出它们;而不是扔e;这将抛出一个新的例外。 – ajs410 2010-04-16 15:04:23