Nee*_*eel 18 java multithreading exception
在Java线程中,'run'方法不能抛出'checked exception'.我在Core Java(第1卷)一书中遇到过这个问题.有人可以解释背后的原因吗?
Nik*_*bak 19
有人可以解释背后的原因吗?
是的,因为run
JVM会小心忽略您在方法中抛出的任何异常.因此,抛出它可能是一个错误(除非你有线程的特定异常处理程序,请参阅有关该文档的文档).没有理由煽动潜在的错误行为.
或者,举个例子.
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)
什么会捕获异常并处理它?我们假设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
方法中的异常,然后可能有办法通知另一个对象该线程失败.
归档时间: |
|
查看次数: |
27136 次 |
最近记录: |