为什么只得到零点异常堆栈的一小部分

时间:2013-11-29 08:39:27

标签: java

我从下面收到NullPointException。

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

因为我用户使用ThreadPoolExecutor,并在此线程方法中获取Exception。然后我有其他方法覆盖afterExecute:

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

我在afterExecute中调用其他方法:

    T result = future.get();

此方法将导致零点异常:

我的问题是。 最初几次,我得到例外。我可以看到异常的完全日志。 但在那之后,我只能看到这个例外的一小部分:

第1次:

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)

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

1 个答案:

答案 0 :(得分:2)

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

Documentation

中提到了它
  

服务器VM中的编译器现在为所有“冷”内置异常提供正确的堆栈回溯。出于性能目的,当抛出这样的异常几次时,可以重新编译该方法。重新编译之后,编译器可以使用不提供堆栈跟踪的预分配异常来选择更快的策略。 要完全禁用预分配的异常,请使用以下新标志:-XX:-OmitStackTraceInFastThrow。