Java 线程:Run 方法不能引发选中的异常
2022-09-01 18:57:01
在 Java 线程中,“run”方法不能引发“已检查异常”。我在Core Java(第1卷)一书中遇到了这个问题。有人可以解释一下它背后的原因吗?
在 Java 线程中,“run”方法不能引发“已检查异常”。我在Core Java(第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?
什么会捕获异常并处理它?假设 run 方法可能会引发已检查的异常。然后你可以这样写代码:
Thread myThread = new Thread(aRunnable);
try{
myThread.start();
}
catch(Exception e){
e.printStackTrace();
}
//do other stuff
但是一旦你调用,新线程将在后台启动,当前线程继续并退出try-catch并执行其他操作。因此,如果以后确实抛出了异常,则无法捕获它!myThread.start
myThread
您需要做的是处理方法中的异常,然后可能有一种方法可以通知另一个对象此线程失败。run