当前位置: 首页 > 知识库问答 >
问题:

在java中,如何捕捉子线程抛出的异常,然后从父线程再次抛出

燕文昌
2023-03-14

我目前有以下示例代码,我试图将OutputStream转换为InputStream,这是我从http://blog.ostermiller.org/convert-java-outputStream-InputStream中的方法2获得的想法

但这里我的问题是,save方法可能会抛出IOException,我希望捕获它,并将其作为getInputStream方法的一部分重新抛出。

public InputStream getInputStream() throws IOException {
    PipedInputStream in = new PipedInputStream();
    PipedOutputStream out = new PipedOutputStream(in);
    Thread t = new Thread(new Runnable() {
        public void run () {
            try {
                save(out); // this save method can throw IOException
            } catch (IOException e) {
                throw new RuntimeException("Failed to save entries to output stream", e);
            }
        }
    });
    t.start();

    return in;
}


private void save(OutputStream out) throws IOException {...}  

我读过如何从线程捕捉异常,但我觉得我的问题仍然不同,因为我想在父线程中重新抛出异常,上面的问题只解决了捕捉异常的问题

共有1个答案

茹高义
2023-03-14

但这里我的问题是,save方法可能会抛出IOException,我希望捕获它,并将其作为getInputStream方法的一部分重新抛出。

不能这样做,因为在getInputStream()返回后很长时间,后台线程执行save()时会引发异常。

如果save()IOExceptionPipedOutputStream>这种情况的一个例子是save()查询数据库,并将结果写入流;如果查询失败,则需要将SQLException记录在正在读取该流的线程中。读取线程可以读取pipedinputstream,然后检查它将任务提交给executorservice时收到的future,看看它是否异常完成。

但是,如果您不需要save()抛出的异常中的任何信息,而只是想在读取相应的pipedinputstream的线程中抛出一个异常,只需让后台线程死亡即可。当主线程试图从其pipedinputstream中读取时,它将在主线程中引发“breaked pipe”IOException

 类似资料:
  • 本文向大家介绍Java多线程之多线程异常捕捉,包括了Java多线程之多线程异常捕捉的使用技巧和注意事项,需要的朋友参考一下   一:为什么要单独讲多线程的异常捕捉呢? 先看个例子:   在run中手动抛出了一个运行时异常,在main中启动线程,catch语句块中捕捉下异常,捕捉到打印一句话。运行结果如下图:   发现异常被抛到了控制台,没有打印catch块中的语句。   结论:多线程运行不能按照顺

  • 我正在为以下Java代码编写单元测试: 我试图模拟myService抛出错误的过程。myMethod(),以便在上面代码的catch块中提取它,并抛出MyException实例。 在我的JUnit测试中(使用org.springframework.test.context.junit4. SpringJUnit4ClassRunner和Mockito),我嘲笑了MyService并将其作为Spri

  • 我应该实现一个原始的多线程服务器,为每个连接启动一个新线程。 其中一个线程可能会收到关闭服务器的消息。 是否可以从其中一个子线程通知父线程停止接受新连接并关闭服务器?

  • 我是java新手,我正在尝试计算净收入,如果我得到负净值,我希望用户返回计算。我尝试使用try cat语句,但它无法返回到开始的位置。请帮助。 下面是我的代码

  • 捕获异常的处理器也可以决定不处理异常或释放资源,然后让其他处理器处理这个异常。这时,处理器只要再抛出异常,如下所示:throw; 这种不带参数的throw再抛出异常。如果开始没有抛出异常,则再抛出异常调用terminate。 常见编程错误 13.12 将空 throw 语句放在catch处理器之外,执行这种throw会调用terminate。即使处理器能处理异常,不管这个异常是否进行处理,处理器仍