我需要抛出异常。唯一的问题是从方法内部启动的线程抛出异常。
这是我的意思的一个例子:
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
抛出异常并让用户处理它。但是,这甚至可能吗?如果是这样,怎么样?如果我不能或不应该抛出异常,我应该如何通知用户出错的地方?
答案 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的工作方式。