为什么Run类的线程类不允许抛出异常?

时间:2014-08-20 06:04:05

标签: java

我在网上搜索,但没有得到令Sun工程师的满意答案 禁止runnable接口的run方法抛出异常。

6 个答案:

答案 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()方法没有能力解决异常运行方法,不允许你抛出异常