Java 线程:Run 方法不能引发选中的异常

2022-09-01 18:57:01

在 Java 线程中,“run”方法不能引发“已检查异常”。我在Core Java(第1卷)一书中遇到了这个问题。有人可以解释一下它背后的原因吗?


答案 1

有人可以解释一下它背后的原因吗?

是的,因为您在方法中抛出的任何异常都会被JVM小心地忽略。因此,将其扔在那里可能是一个错误(除非您有线程的特定异常处理程序,请参阅有关该操作的文档)。没有理由煽动潜在的错误行为。run

或者,举个例子。

 class MyThread extends Thread {
     public void run() {
         throw new RuntimeException();
     }
 }

...

new MyThread().start();
// here thread dies silently with no visible effects at all

编辑

为什么父线程无法从生成的“子”线程中“捕获”异常?

@chaotic3quilibrium在他的评论中已经指出为什么不这样做:因为父线程可能已经移动了。

new MyThread().start(); // launch thread and forget

// 1000 lines of code further...
i = i + 1; // would you like exception from child thread to be propagated here?

答案 2

什么会捕获异常并处理它?假设 run 方法可能会引发已检查的异常。然后你可以这样写代码:

Thread myThread = new Thread(aRunnable);
try{
    myThread.start();
}
catch(Exception e){
   e.printStackTrace();
}
//do other stuff

但是一旦你调用,新线程将在后台启动,当前线程继续并退出try-catch并执行其他操作。因此,如果以后确实抛出了异常,则无法捕获它!myThread.startmyThread

您需要做的是处理方法中的异常,然后可能有一种方法可以通知另一个对象此线程失败。run