您的问题是关于如何捕获子线程的异常并在父线程中引发它。
从技术上讲,与其他答案一样,子线程中的中断确实在父线程中引发异常之间没有关系。
public static void main(String[] args){
Thread child = new Thread(){
public void run () {
try {
Object obj = null;
String s = obj.toString(); //this will throw NullPointer
} catch (NullPointerException e) {
throw new RuntimeException("Hoping this reaches the parent! as NPE but it wont", e);
}
}
};
child.start();
}
但是,请回答您关于如何去做的问题。您可以使用Future<?> 并让Runnable 或Callable 执行等效操作并查看Future Result 的值
这是一个可以调用doSomething()的例子:
void doSomething(){
Object s = null;
System.out.println("You want to do something here!" + s.toString()); // This will throw NPE
}
现在假设您想在单独的线程中运行它并捕获异常
ExecutorService executor = Executors.newFixedThreadPool(1);
Future result = pool.submit(this::doSomething());
try {
result.get();
}catch (ExcecutionException e){
e.printStackTrace(); //will show null pointer exception
}
现在,在与 threadPool 不同的线程中运行的函数将引发执行异常,您可以选择在主/父线程中捕获该异常,并针对该故障执行您喜欢的操作。
希望这会有所帮助!
更新:
为什么从子线程中杀死父线程是不好的做法?
从线程外部终止任何线程是一个非常糟糕的主意。这是因为终止线程不知道目标在做什么以及它是否在“安全”点终止。例如,您可能正在编写输出、进行计算或其他任何事情。 ref.1
关于为什么你甚至应该停止/杀死/终止整个 JVM,也从来没有真正好的候选者。除非在我不断掌握 Java 和核心概念的过程中,我从来不需要处理杀死父进程的子进程。
只是为了详细说明,具体来说,实际上没有“子”线程或“父”线程的概念。 JVM 甚至也不跟踪哪个线程创建了哪个线程。
它主要基于线程组,例如。 “groupA”和“groupB”,只有一个“groupA”创建了“groupB”,JVM知道并跟踪。
如果你真的想停止 JVM。只需拨打System.exitref.2
考虑看看这个question也