“Thread.setDefaultUncaughtExceptionHandler”的构造函数和静态代码有什么区别?功能

发布于 2025-01-10 21:18:23 字数 1299 浏览 0 评论 0原文

构造函数和静态代码有什么区别?

为什么Thread.setDefaultUncaughtExceptionHandler不能在构造函数中工作?

源代码 1:

class MyUncaughtExceptionHandler implements
        Thread.UncaughtExceptionHandler {
    @Override
    public void uncaughtException(Thread t, Throwable e) {
        System.out.println("caught " + e.getMessage());
    }
}
public class CaughtExceptionThread extends Thread{

    static {
        Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
    }
}

源代码 2:

class MyUncaughtExceptionHandler implements
        Thread.UncaughtExceptionHandler {
    @Override
    public void uncaughtException(Thread t, Throwable e) {
        System.out.println("caught " + e.getMessage());
    }
}
public class CaughtExceptionThread extends Thread{

    public CaughtExceptionThread() {
        Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
    }
}

测试代码:

public class DefaultExceptionHandler extends CaughtExceptionThread{

    public static void main(String[] args) {
        ExecutorService es =
                Executors.newCachedThreadPool();
        es.execute(new ExceptionThread());
        es.shutdown();
    }
}

为什么源代码 1 可以工作,而源代码 2 却不能?

What is the difference between constructor and static code?

Why Thread.setDefaultUncaughtExceptionHandler can not work in constructor?

Source code 1:

class MyUncaughtExceptionHandler implements
        Thread.UncaughtExceptionHandler {
    @Override
    public void uncaughtException(Thread t, Throwable e) {
        System.out.println("caught " + e.getMessage());
    }
}
public class CaughtExceptionThread extends Thread{

    static {
        Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
    }
}

Source code 2:

class MyUncaughtExceptionHandler implements
        Thread.UncaughtExceptionHandler {
    @Override
    public void uncaughtException(Thread t, Throwable e) {
        System.out.println("caught " + e.getMessage());
    }
}
public class CaughtExceptionThread extends Thread{

    public CaughtExceptionThread() {
        Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
    }
}

Test Code:

public class DefaultExceptionHandler extends CaughtExceptionThread{

    public static void main(String[] args) {
        ExecutorService es =
                Executors.newCachedThreadPool();
        es.execute(new ExceptionThread());
        es.shutdown();
    }
}

Why source code 1 is working but source code 2 is not?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文