如何从线程中抛出异常?

时间:2014-03-02 20:11:10

标签: java multithreading exception

我需要抛出异常。唯一的问题是从方法内部启动的线程抛出异常。

这是我的意思的一个例子:

public void connectToWebsite(String URL){
    new Thread(){
        @Override
        public void run(){
           openURLConnection(URL);//Throws Malformed URL and IO Exception
        }
   };
}

这是API的一部分,所以我想允许API的用户处理他们如何选择的异常。但是,我无法让connectToWebsite(url)抛出异常,因为在运行中抛出了异常。我无法让run()抛出异常,因为它不会覆盖run方法。有没有办法可以在不构建整个新线程类的情况下抛出异常?或者我应该选择添加printStackTrace s?

理想情况下,我希望connectToWebsite抛出异常并让用户处理它。但是,这甚至可能吗?如果是这样,怎么样?如果我不能或不应该抛出异常,我应该如何通知用户出错的地方?

2 个答案:

答案 0 :(得分:5)

  

有没有办法可以在不构建整个新线程类的情况下抛出异常?或者我应该选择使用printStackTraces添加一个catch吗?

你可以做几件事。最好的可能是切换到使用ExecutorService并使用Callable而不是runnable。您可以将Callable提交给返回ExecutorService的{​​{1}}。当您调用Future时,如果您的future.get()方法引发异常,则会抛出异常。它实际上会抛出call(),并且该异常的原因将是ExecutionException抛出的异常。

您还可以使用call()并在UncaughtExceptionHandler上进行设置。然后,如果你进行线程抛出,那么将使用异常调用处理程序。

答案 1 :(得分:0)

Runnable不能抛出异常或返回值。

可以做的一件事是让openURLConnection创建的对象为null。因此用户将检查

if (object == null) { /* something went wrong with url connection */ }
else {
/* all ok */
}

并知道是否出现了问题。

这取决于您的API的工作方式。