我有一个看起来像这样的代码(为了简短的代码,我将所有内容都放在一个方法中)。
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的重复项,因为我不问如何捕获异常,而是问为什么它不通知异常。