Java 为什么我的代码似乎绕过了这个异常?
鉴于此代码:Java 为什么我的代码似乎绕过了这个异常?,java,multithreading,exception,Java,Multithreading,Exception,鉴于此代码: public class TwoThreads { static Thread laurel, hardy; public static void main(String[] args) { laurel = new Thread() { public void run() { System.out.println("A"); try {
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
考虑到在synchronized
代码之外调用wait()时会抛出IllegalMonitorStateException
,我对为什么包含F感到困惑。为什么达到F的打印语句?我相信线程堆栈会崩溃,但是程序应该将控制权传递给它的主堆栈
这是否正确?您在打印“E”的块中捕获异常,并有效地将其吞没。代码将继续打印“F”。由于这个原因,只捕获异常而不执行其他操作的块是危险的。您捕获了异常,因此控制转到catch块,然后在try/catch之后继续执行代码。在上面的代码中,只要在“D”打印为“F”之后它们是非应用程序致命错误将始终在处理所有可捕获错误时打印 如果没有线程挂起,这种行为将是一致的
在“F”中添加一个布尔检查,如果抛出错误,该检查将被抑制,这将为您提供所需的行为。作为补充说明,您正在调用对象上的线程静态
sleep
方法,该方法执行的操作超出了您的预期。因此,不应该在实例上调用静态类方法
(至于为什么打印F,其他人是正确的)我想知道你怎么知道抛出了
非法监视器状态异常。您正在使用任何异常
,而没有执行类似e.printStackTrace()的操作
+1完全正确,如果您想在捕获异常时打印到日志,请确保在捕获异常后使用throw重新抛出它们;不要扔垃圾;这将引发一个新的异常。