Java 如何从线程中抛出异常?

Java 如何从线程中抛出异常?,java,multithreading,exception,Java,Multithreading,Exception,我需要抛出一个异常。唯一的问题是异常是从方法中启动的线程引发的 以下是我的意思的一个例子: public void connectToWebsite(String URL){ new Thread(){ @Override public void run(){ openURLConnection(URL);//Throws Malformed URL and IO Exception } }; } 这是API的

我需要抛出一个异常。唯一的问题是异常是从方法中启动的线程引发的

以下是我的意思的一个例子:

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的catch吗


理想情况下,我希望一个
connectToWebsite
抛出一个异常并让用户处理它。然而,这有可能吗?如果是,怎么做?如果我不能或不应该抛出异常,我应该如何通知用户出错?

Runnable
不能抛出异常或返回值

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

if (object == null) { /* something went wrong with url connection */ }
else {
/* all ok */
}
知道是否出了问题


这取决于API的工作方式。

Runnable
无法引发异常或返回值

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

if (object == null) { /* something went wrong with url connection */ }
else {
/* all ok */
}
知道是否出了问题

这取决于API的工作方式

有没有一种方法可以在不构建整个新线程类的情况下获得抛出的异常?或者我应该决定添加一个带有printStackTraces的catch吗

你可以做几件事。最好的方法是切换到使用
ExecutorService
并使用
Callable
而不是runnable。您可以将您的
Callable
提交给
ExecutorService
,该服务将返回
未来
。调用
future.get()
时,如果
call()
方法引发异常,它将引发异常。它实际上抛出了
ExecutionException
,而该异常的原因将是
call()
引发的异常

您还可以使用
UncaughtExceptionHandler
并在
线程上设置它。然后,如果线程抛出,处理程序将被调用,但出现异常

有没有一种方法可以在不构建整个新线程类的情况下获得抛出的异常?或者我应该决定添加一个带有printStackTraces的catch吗

你可以做几件事。最好的方法是切换到使用
ExecutorService
并使用
Callable
而不是runnable。您可以将您的
Callable
提交给
ExecutorService
,该服务将返回
未来
。调用
future.get()
时,如果
call()
方法引发异常,它将引发异常。它实际上抛出了
ExecutionException
,而该异常的原因将是
call()
引发的异常


您还可以使用
UncaughtExceptionHandler
并在
线程上设置它。然后,如果线程抛出,处理程序将被调用,并出现异常。

您编写了哪个API来声明抛出异常,请在Methods上使用它。您看到了吗?刚刚发现。看一看。未捕获的异常通过可以重写的方法处理。发生异常的线程作为参数传递给此处理程序。正如@Thüzhen所建议的,有一个默认异常处理程序“捕获”异常,使其一直到达线程的根框架而不被处理。应用程序开发人员可以(如果JVM权限规则不禁止)更改此处理程序以执行开发人员的请求。您编写哪个API来声明抛出异常,请在MethodsId上使用它。您看到了吗?刚刚发现。看一看。未捕获的异常通过可以重写的方法处理。发生异常的线程作为参数传递给此处理程序。正如@Thüzhen所建议的,有一个默认异常处理程序“捕获”异常,使其一直到达线程的根框架而不被处理。应用程序开发人员可以(如果JVM权限规则未禁止)更改此处理程序以执行开发人员的投标。