Java Thread:Run方法不能抛出已检查的异常

Nee*_*eel 18 java multithreading exception

在Java线程中,'run'方法不能抛出'checked exception'.我在Core Java(第1卷)一书中遇到过这个问题.有人可以解释背后的原因吗?

Nik*_*bak 19

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

是的,因为runJVM会小心忽略您在方法中抛出的任何异常.因此,抛出它可能是一个错误(除非你有线程的特定异常处理程序,请参阅有关该文档的文档).没有理由煽动潜在的错误行为.

或者,举个例子.

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

...

new MyThread().start();
// here thread dies silently with no visible effects at all
Run Code Online (Sandbox Code Playgroud)

编辑

为什么父线程不能从生成的'子'线程'捕获'异常?

@ 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?
Run Code Online (Sandbox Code Playgroud)

  • 沉默忽视可能会产生误导.该异常将由线程的UncaughtExceptionHandler处理,其默认实现将在杀死线程之前将堆栈跟踪转储到System.err.至于原因:VM如何知道该怎么做? (4认同)

dog*_*ane 9

什么会捕获异常并处理它?我们假设run方法可以抛出一个已检查的异常.然后你可以写这样的代码:

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

但是一旦你调用myThread.start,新线程就会在后台启动,当前线程会继续并退出try-catch并执行其他操作.所以,如果以后myThread再抛出异常,你就无法抓住它!

你需要做的是处理run方法中的异常,然后可能有办法通知另一个对象该线程失败.