为啥我看不到从 java 守护线程抛出的异常 [重复]

Posted

技术标签:

【中文标题】为啥我看不到从 java 守护线程抛出的异常 [重复]【英文标题】:Why can't I see exception thrown out from java daemon thread [duplicate]为什么我看不到从 java 守护线程抛出的异常 [重复] 【发布时间】:2017-12-23 04:22:15 【问题描述】:

我写了一段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);

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

【问题讨论】:

提问前请先搜索SO:***.com/questions/6546193/… 【参考方案1】:

这是因为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.

尝试在t.start() 之后立即执行Thread.sleep(1000) 以查看消息是否已记录。

【讨论】:

以上是关于为啥我看不到从 java 守护线程抛出的异常 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

XmlDocument.Save 从 GC 线程抛出的未处理异常

捕获Java线程池执行任务抛出的异常

如何从线程中捕获异常

从 std::scoped_lock 抛出的异常

为啥即使使用了调用,组合框也会抛出异常

为啥内部异常到达 ThreadException 处理程序而不是实际抛出的异常?