首页 > 解决方案 > 线程内控制台中没有空指针异常消息

问题描述

我有一个看起来像这样的代码(我把所有东西都放在一个方法中,只是为了更短的代码)。

public static void main(String[] args) {

    @lombok.Data
    class Data {
        Data previous;
        String text;

        public Data(Data data) {
            this.text = data.text;
        }

        public Data(String text) {
            this.text = text;
        }
    }

    class PlainThread implements Runnable {
        private Data data;

        public PlainThread(Data data) {
            this.data = data;
        }

        @Override
        public void run() {
            int i = 0;
            while (i != 5) {
                // application stops but no notification of exception
                System.out.println(data.previous.text);

                ThreadUtils.delaySeconds(1);
                i++;
            }
        }
    }

    System.out.println("Starting...");
    Data data = new Data("Simple text");
    // application fails there
    // System.out.println(data.previous.text);

    PlainThread thread = new PlainThread(new Data("Simple text"));
    ExecutorService executorService = Executors.newFixedThreadPool(2);
    executorService.submit(thread);
    executorService.shutdown();
}

基本上我创建的对象Data包含对另一个Data默认为空的对象的引用。我把这个对象放在应该获取text另一个对象的字段的线程中。previous因为我在实例化对象时没有设置

Data data = new Data("Simple text");

我把线放进去ExecutorService。我希望Null Pointer Exception在这个线程循环中收到控制台和应用程序故障

while (i != 5) {
    // application stops but no notification of exception
    System.out.println(data.previous.text);

    ThreadUtils.delaySeconds(1);
    i++;
}

但是我没有收到异常发生的通知(或控制台中的堆栈跟踪)。

如果我System.out.println在 while 循环内换成 try-catch 块

try {
    // application stops but no notification of exception
    System.out.println(data.previous.text);
} catch (Exception exc) {
    System.out.println(exc);
}

它打印出异常java.lang.NullPointerException

为什么会这样?为什么它不会在控制台中显示异常

Exception in thread "main" java.lang.NullPointerException
    at com.xxx.Main.main(Main.java:83)

编辑: 问题不是如何从线程中捕获异常的重复项,因为我不问如何捕获异常,而是询问为什么它不通知异常。

标签: javamultithreading

解决方案


推荐阅读