我从下面的地方得到了 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 中的优化。在多次抛出相同的异常并打印堆栈跟踪后,它会优化并打印截断的堆栈跟踪。
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/