java - 为什么只得到一小部分空点异常堆栈

标签 java

我从下面的地方得到了 NullPointException。

at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:222)
at java.util.concurrent.FutureTask.get(FutureTask.java:83)

因为我使用ThreadPoolExecutor,并在这个线程方法中得到异常。然后我有其他方法覆盖 afterExecute:

   @Override
protected void afterExecute(Runnable r, Throwable t) {

我在 afterExecute 中调用其他方法:

    T result = future.get();

该方法会导致空点异常:

我的问题是这样的。 第一次时,我遇到了异常。我可以看到异常的完整日志。 但在那之后,我只能看到这个异常的一小部分:

第一次几次:

java.lang.NullPointerException
    at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:222)
    at java.util.concurrent.FutureTask.get(FutureTask.java:83)
    at com.xxxxx.xxxxx.execution.AbstractExecutionUnit.getResult(AbstractExecutionUnit.java:93)
    at com.xxxxx.xxxxx.execution.AbstractExecutionUnit.afterExecute(AbstractExecutionUnit.java:153)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:888)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.NullPointerException
    at com.xxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx(BetRadarCache.java:134)
    at com.xxxxx.xxxxx.execution.OMDataModelServiceImpl$10.call(OMDataModelServiceImpl.java:1010)
    at com.xxxxx.xxxxx.execution.OMDataModelServiceImpl$10.call(OMDataModelServiceImpl.java:999)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    ... 2 more

之后:

java.lang.NullPointerException
at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:222)
at java.util.concurrent.FutureTask.get(FutureTask.java:83)
at com.xxxxx.xxxxx.execution.AbstractExecutionUnit.getResult(AbstractExecutionUnit.java:93)
at com.xxxxx.xxxxx.execution.AbstractExecutionUnit.afterExecute(AbstractExecutionUnit.java:153)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:888)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)

为什么日志不一样?如果有人能解释原因,我真的很感激。

最佳答案

这是 JVM 中的优化。在多次抛出相同的异常并打印堆栈跟踪后,它会优化并打印截断的堆栈跟踪。

Documentation中提到

The compiler in the server VM now provides correct stack backtraces for all "cold" built-in exceptions. For performance purposes, when such an exception is thrown a few times, the method may be recompiled. After recompilation, the compiler may choose a faster tactic using preallocated exceptions that do not provide a stack trace. To disable completely the use of preallocated exceptions, use this new flag: -XX:-OmitStackTraceInFastThrow.

关于java - 为什么只得到一小部分空点异常堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20281429/

相关文章:

java - 是否可以在 JavaDoc 中重用 @param 描述?

javascript - 我如何在 scriplet 中使用 javascript var

java - 给定一个 Swing 容器和坐标,我如何找到制造的鼠标事件的源?

java - 我应该使用 '-server' 选项运行 JMH 基准测试吗

java - C# 中的 Rectangle2D .outcode 等效吗?

java - 如何在 Java 中使用 StAX Parser 在 XML 中声明 DOCTYPE 和 ENTITY

java - 如何使用gradle 'api'依赖

java - Jodatime 时差得出负结果

java - 如何在 Mac OS 10.6.6 上运行 Java Applet

java - 如果 SoftReference 的引用已被 GC,如何对其进行 GC