首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在这个多线程示例中没有捕获异常?

为什么在这个多线程示例中没有捕获异常?
EN

Stack Overflow用户
提问于 2021-01-07 17:00:19
回答 1查看 149关注 0票数 2

我试图了解异常是如何在多线程中传播的。

问题

在下面的示例中。为什么RuntimeException异常未被捕获

代码语言:javascript
复制
`System.out.println("Exception handled " + e); 

给定代码

代码语言:javascript
复制
package p05_Interrupt;

public class D05_Interrupt1 extends Thread {
  public void run()  {
    try {
      Thread.sleep(1000);
      System.out.println("task");
    } catch (InterruptedException e) {
      throw new RuntimeException("Thread interrupted..." + e);
    }
  }

  public static void main(String args[]) {
    D05_Interrupt1 t1 = new D05_Interrupt1();
    t1.start();
    try {
      t1.interrupt();
    } catch (Exception e) {
      System.out.println("Exception handled " + e); // Why not print this line 
    }
  }
}

JavaTpoint中的第一个示例“中断停止工作的线程的示例”

输出

代码语言:javascript
复制
Exception in thread "Thread-0" java.lang.RuntimeException: Thread interrupted...java.lang.InterruptedException: sleep interrupted
    at p05_Interrupt.D05_Interrupt1.run(D05_Interrupt1.java:9)

这是因为这是多线程,所以异常在线程t1中打印,而main()线程的输出是隐藏的吗?

我还试图向public void run() throws RuntimeException {添加抛球,但没有改变任何事情。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-07 17:29:05

您不能捕获线程在主线程中抛出的异常。但是,您可以实现Thread.UncaughtExceptionHandler来实现这一点。

公共静态接口Thread.UncaughtExceptionHandler接口,用于在线程突然终止时调用的处理程序。 当一个线程由于一个不明确的异常而即将终止时,Java将使用Thread.getUncaughtExceptionHandler()查询线程的UncaughtExceptionHandler,并调用处理程序的uncaughtException方法,将线程和异常作为参数传递。如果一个线程没有显式设置它的UncaughtExceptionHandler,那么它的ThreadGroup对象就充当它的UncaughtExceptionHandler。如果ThreadGroup对象没有处理异常的特殊要求,它可以将调用转发到默认的未处理异常处理程序。

代码语言:javascript
复制
public class D05_Interrupt1 extends Thread 
        implements Thread.UncaughtExceptionHandler {

    public void run() {
        try {
            Thread.sleep(1000);
            System.out.println("task");
        } catch (InterruptedException e) {
            throw new RuntimeException("Thread interrupted..." + e);
        }
    }

    public static void main(String args[]) {
        D05_Interrupt1 t1 = new D05_Interrupt1();
        Thread.setDefaultUncaughtExceptionHandler(t1);
        t1.start();
        t1.interrupt();
    }

    @Override
    public void uncaughtException(Thread t, Throwable e) {
        System.out.println("Exception handled " + e); // Why not print this line
    }
}

输出:

代码语言:javascript
复制
Exception handled java.lang.RuntimeException: Thread interrupted...java.lang.InterruptedException: sleep interrupted
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65616757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档