我在网上搜索,但没有得到令Sun工程师的满意答案 禁止runnable接口的run方法抛出异常。
答案 0 :(得分:3)
多线程概念背后的意图是允许并行处理使用run方法的两个或多个任务。如果run
方法抛出CheckedException
,在这种情况下,调用线程必须在相应的catch块中等待,否则它将违背多线程的唯一目的。
For example
:考虑以下假设情景
main thread
开始另一个帖子说Thread1
,据说这会引发一些CheckedException
。现在要捕获该异常,必须将相应的catch块放在某处。让我们说主要方法本身也是一样的。现在要捕获该异常(由Thread1的run方法生成),主线程必须在catch块内等待让Thread1的run方法的执行完成,这是不可接受的,因为那样会在这里不要使用多线程。
此外,Future和Callable任务仅基于上述假设。
答案 1 :(得分:2)
问题的答案可能是一个问题,问自己如果run方法抛出一个异常那么会有什么能够捕获它?
来自JCIP docs:
Runnable是一个相当有限的抽象; run无法返回值 或抛出检查过的异常。
但是,您可以使用Callable
,然后将其提交给ExecutorService
并等待FutureTask.isDone()
ExecutorService.submit()
的结果
这样的事情:
Callable<Void> callable = new Callable<Void>() {
public Void call() {
// whatever you want
return null;
}
};
答案 2 :(得分:1)
为了填补这个空白,因为引入了Jdk 1.5 onwords Callable<V>
,它为您提供了创建异步任务并返回结果并可能抛出异常。
代码段 -
public class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
...
}
}
...
FutureTask<String> futureTask1 = new FutureTask<String>(new MyCallable());
ExecutorService executor = Executors.newFixedThreadPool(1);
executor.execute(futureTask1);
try{
String result = futureTask1.get();
...
}catch(Exception ex){ // catch that exception
}
答案 3 :(得分:0)
调用方法不会直接调用run()
来启动Thread
。需要拨打Thread.start()
,然后调用run()
方法。因此,从run()
方法抛出已检查的异常是没有意义的。
此外,JVM会小心忽略您在run方法中抛出的任何异常。因此,抛出它可能是一个错误(除非你有线程的特定异常处理程序)
有关详细说明,请参阅此处:Java Thread: Run method cannot throw checked exception
答案 4 :(得分:0)
已检查异常与未经检查的异常。
第一点是错误的假设run()
方法不能抛出异常。请参阅以下代码编译
public class Test extends Thread{
@Override
public void run() throws IllegalArgumentException {
// TODO Auto-generated method stub
super.run();
}
}
现在看下面的代码,它将无法编译。
public class Test extends Thread{
@Override
public void run() throws FileNotFoundException {
// TODO Auto-generated method stub
super.run();
}
}
关键是run()nethod不能抛出Checked Exception,如果它可以抛出我们会抓到哪个Exception?
答案 5 :(得分:0)
如果任何调用方法(例如void m1())抛出异常,则调用方法(pp.m1())必须解决或重新抛出异常,如下////
public class Practice14 {
public void m1() throws Exception{
System.out.println("hello");
}
public static void main(String[] args) {
Practice14 pp=new Practice14();
try {
pp.m1();//here solving the exception
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
因为线程中的start()方法没有能力解决异常运行方法,不允许你抛出异常