MST

星途 面试题库

面试题:Java多线程中如何在子线程捕获异常

在Java多线程编程中,创建一个新线程执行任务,任务可能会抛出异常。请描述如何在子线程中捕获并处理该异常,同时说明`try - catch`块在这种场景下的正确位置。
21.9万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

在Java多线程编程中,要在子线程中捕获并处理异常,可以通过以下方式:

  1. 使用try - catch:在子线程执行的任务代码中添加try - catch块。例如,当使用Thread类创建线程时:
Thread thread = new Thread(() -> {
    try {
        // 可能抛出异常的任务代码
        int result = 10 / 0; // 模拟一个会抛出ArithmeticException的操作
    } catch (ArithmeticException e) {
        System.out.println("捕获到异常: " + e.getMessage());
    }
});
thread.start();

在上述代码中,try - catch块位于Runnable接口的实现代码块中,也就是子线程实际执行的任务代码处。这是try - catch块正确的位置,它可以捕获在该子线程任务执行过程中抛出的异常。

  1. 使用UncaughtExceptionHandler: 可以为线程设置UncaughtExceptionHandler来处理未捕获的异常。首先定义一个实现Thread.UncaughtExceptionHandler接口的类:
class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
    @Override
    public void uncaughtException(Thread t, Throwable e) {
        System.out.println("线程 " + t.getName() + " 抛出未捕获异常: " + e.getMessage());
    }
}

然后在创建线程时设置这个处理器:

Thread thread = new Thread(() -> {
    int result = 10 / 0; // 模拟一个会抛出ArithmeticException的操作
});
thread.setUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
thread.start();

这种方式适用于集中处理子线程中未被try - catch块捕获的异常,当异常在子线程中抛出且未被捕获时,UncaughtExceptionHandleruncaughtException方法会被调用。