java - 线程内控制台中没有空指针异常消息
问题描述
我有一个看起来像这样的代码(我把所有东西都放在一个方法中,只是为了更短的代码)。
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)
编辑: 问题不是如何从线程中捕获异常的重复项,因为我不问如何捕获异常,而是询问为什么它不通知异常。