“嗨,阿米戈!

“我想告诉你一件小事,但很有趣。”

“我在听。我喜欢小而有趣的东西。”

“嗯,你知道每个 Thread 对象都有一个 run() 方法。你可以使用 start() 方法在单独的线程上执行它。”

“是的当然。”

“但是现在想象一下这种情况:你启动一个线程来执行一些工作,但是抛出异常并且线程停止运行,因为它不知道该怎么做。你不需要以某种方式知道这个错误吗?”

“我同意。我需要以某种方式捕获发生在另一个正在运行的线程上的异常。Java 支持吗?”

“你侮辱我,当然是。”

“Java 的创建者发明了一个名为 UncaughtExceptionHandler 的特殊接口。下面是如何捕获和处理另一个线程上发生的异常,如果该线程没有捕获它的话:”

例子
public class DownloadManager
{
 public static void main(String[] args)
 {
   Thread thread = new DownloadThread();
   thread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler()
   {
    @Override
    public void uncaughtException(Thread t, Throwable e)
    {

    }
 });

 thread.start();
}

“Thread 对象有一个特殊的setUncaughtExceptionHandler方法。您需要向它传递一个实现Thread.UncaughtExceptionHandler接口的对象。该接口只有一个方法:uncaughtException(Thread t, Throwable e)。这是将在如果在 run 方法中发生未捕获的异常,则传递的对象。”

“在我上面的示例中,我只是声明了一个匿名内部类(以红色突出显示),它实现了 Thread.Thread.UncaughtExceptionHandler接口。我覆盖了它的uncaughtException(Thread t, Throwable e)方法。”

“从方法的参数列表中可以看出,将传递两个参数:对发生异常的 Thread 对象的引用,以及异常本身,作为 Throwable e 传递。”

“嗯,为什么我需要 Thread 变量 t?难道我们不知道我们要将Thread.UncaughtExceptionHandler对象放入哪个线程吗?”

“他们这样做是为了让你可以为这些情况编写一个通用的处理程序。即你可以创建一个对象并将它传递给几十个不同的线程。然后 uncaughtException( Thread t, Throwable e)方法总是给你一个引用发生异常的线程对象。”

“更重要的是,你可以创建几十个线程,例如,在一个循环中执行特定任务。一般来说,这个对 Thread 对象的引用不会是多余的。我向你保证。”

“我相信你。你从来没有错。”