线程池中线程的运行时异常完全消失:如何处理

时间:2017-12-01 18:59:52

标签: java multithreading

朋友们在下面看到这个简单的代码。请注意,我使用的是线程池,因此我无法直接访问代码中的线程。
在这段代码中,应该有一个NPE,但它会完全消失,代码会以静默方式退出。我理解也许异常堆栈在主线程中不可用,但是世界上如何显示运行时异常的出现?我不想在整个代码中放置try-catch(Exception e),因为我无法确定NPE或运行时异常可能发生的位置。必须在杀死JVM之前显示运行时异常。但是怎么样?我甚至在主线程周围进行了try-catch(Exception),但无济于事。

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;

public class Test {

    ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(4);

    public static void main(String[] args) {
        new Test().execute();
    }

    void execute(){
        System.out.println("start");

        List<Callable<String>>li = new ArrayList<>();

        li.add(() -> {
            String s = null;
            s.toLowerCase();
            return "Hello";
        });

        try {
            List<Future<String>> cs = executor.invokeAll(li);
        } catch (Exception e) {
            e.printStackTrace();
        }

        System.out.println("end");
        executor.shutdown();
    }
}

1 个答案:

答案 0 :(得分:0)

看看Thread.setDefaultUncaughtExceptionHandler
当有未捕获的异常时,这将调用您的处理程序