我从下面收到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)
为什么日志不同?如果有人能解释原因,我真的很感激。
答案 0 :(得分:2)
这是JVM中的优化。在多次抛出相同的异常并打印堆栈跟踪之后,它会优化并打印截断的堆栈跟踪。
中提到了它服务器VM中的编译器现在为所有“冷”内置异常提供正确的堆栈回溯。出于性能目的,当抛出这样的异常几次时,可以重新编译该方法。重新编译之后,编译器可以使用不提供堆栈跟踪的预分配异常来选择更快的策略。 要完全禁用预分配的异常,请使用以下新标志:-XX:-OmitStackTraceInFastThrow。