【问题标题】:How does one throw an exception from a thread?如何从线程中抛出异常?
【发布时间】:2014-04-03 16:13:21
【问题描述】:

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

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

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 方法。有没有一种方法可以在不构建整个新线程类的情况下引发异常?还是我应该只用printStackTraces 添加一个捕获?

理想情况下,我希望connectToWebsite 引发异常并让用户处理它。然而,这甚至可能吗?如果是这样,怎么做?如果我不能或不应该抛出异常,我应该如何通知用户出了问题?

【问题讨论】:

  • 你写哪个API声明抛出异常,在方法上使用
  • book.javanb.com/java-threads-3rd/jthreads3-CHP-13-SECT-5.html 刚刚发现。看看它。未捕获的异常通过可重写的方法进行处理。发生异常的线程作为参数传递给此处理程序。
  • 正如@Thüzhen 建议的那样,有一个默认的异常处理程序可以“捕获”异常,使其一直到线程的根框架而不被处理。应用程序开发人员可以(如果 JVM 权限规则未禁止)更改此处理程序以执行开发人员的投标。

标签: java multithreading exception


【解决方案1】:

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

可以做的一件事是让openURLConnection 创建的对象为空。所以用户会检查

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

并且知道是否出了问题。

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

【讨论】:

    【解决方案2】:

    有没有一种方法可以在不构建全新线程类的情况下引发异常?还是我应该只用 printStackTraces 添加一个捕获?

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-28
      • 1970-01-01
      相关资源
      最近更新 更多