线程内的控制台中没有空指针异常消息

时间:2019-06-15 09:49:02

标签: java multithreading

我有一个看起来像这样的代码(为了简短的代码,我将所有内容都放在一个方法中)。

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对象的引用,默认情况下该对象为null。我将此对象放在应该获取该另一个对象的字段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)

编辑: 问题不是How to catch an Exception from a thread的重复项,因为我不问如何捕获异常,而是问为什么它不通知异常。

0 个答案:

没有答案