为什么我看不到从java守护程序线程抛出的异常

时间:2017-07-18 10:39:51

标签: java multithreading exception daemon

我写了一段Java代码来测试线程,比如:

public static void main(String[] args) {

        Thread t = new Thread(() -> {
                throw new NullPointerException();
        });
        t.setDaemon(true);
        t.start();
    }

我希望看到类似的内容:

Exception in thread "Thread-0" java.lang.NullPointerException
    at com.cisco.ruan.nio.Java8Time.lambda$0(Java8Time.java:23)
    at java.lang.Thread.run(Thread.java:745)

但除非我发表评论t.setDaemon(true);,否则不打印任何内容。

我的问题是为什么在守护程序线程中弹出异常时没有消息。这种设计的目的是什么?

1 个答案:

答案 0 :(得分:3)

这是因为JVM将在抛出异常之前退出,或者记录。

引自https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#setDaemon(boolean)

The Java Virtual Machine exits when the only threads running are all daemon threads.

尝试在Thread.sleep(1000)之后立即t.start()查看邮件是否已记录。