面试题答案
一键面试在Java多线程编程中,要在子线程中捕获并处理异常,可以通过以下方式:
- 使用
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
块正确的位置,它可以捕获在该子线程任务执行过程中抛出的异常。
- 使用
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
块捕获的异常,当异常在子线程中抛出且未被捕获时,UncaughtExceptionHandler
的uncaughtException
方法会被调用。