【发布时间】:2016-08-17 11:07:03
【问题描述】:
我有以下异常(堆栈跟踪):
java.lang.NullPointerException
at sun.reflect.GeneratedConstructorAccessor171.newInstance(Unknown Source) ~[?:?]
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:1.8.0_40]
at java.lang.reflect.Constructor.newInstance(Constructor.java:422) ~[?:1.8.0_40]
at java.util.concurrent.ForkJoinTask.getThrowableException(ForkJoinTask.java:598) ~[?:1.8.0_40]
at java.util.concurrent.ForkJoinTask.reportException(ForkJoinTask.java:677) ~[?:1.8.0_40]
at java.util.concurrent.ForkJoinTask.invoke(ForkJoinTask.java:735) ~[?:1.8.0_40]
at java.util.stream.ForEachOps$ForEachOp.evaluateParallel(ForEachOps.java:160) ~[?:1.8.0_40]
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateParallel(ForEachOps.java:174) ~[?:1.8.0_40]
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:233) ~[?:1.8.0_40]
at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418) ~[?:1.8.0_40]
at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:583) ~[?:1.8.0_40]
at com.tradair.tnet.services.trades.TradeService.updateUnrealizedPNL(TradeService.java:173) ~[tnet.jar:5.1.1.0-SNAPSHOT]
从我的TradeService 课程开始:
public void updateUnrealizedPNL(Set<Org> orgsToCaluclate, Set<Org> orgsToSendUpdate) {
orgsToCaluclate.parallelStream().forEach(o -> {
pnlService.updateMidPrices(o);
Collection<SystemTradeOrder> allLiveTradesByOrgId = tradesRepository.getAllLiveTradesByOrgId(o.getId());
updateUnrealizedPNL(o, allLiveTradesByOrgId);
});
// more code ....
所以看起来异常是在运行forEach(..) 方法时在java 本机代码中引发的。
我的意思是,NullPointerException 不是从我自己的代码中抛出的——不是从我的消费者函数中抛出的,它作为 forEach(..) 方法中的参数出现。
我仔细检查了这段代码运行时orgsToCaluclate 集没有被修改。
这是orgsToCaluclate的初始化:
Set<Org> orgsToCaluclate = getMarginOrgs();
orgsToCaluclate = orgsToCaluclate.stream()
.filter(org -> !isOrgInCloseout(org.getId())).collect(Collectors.toSet());
有什么想法吗?..
【问题讨论】:
-
您是否尝试过检查集合是否为空、null 或其他?此外,如果您没有至少约 6000 个条目,请避免使用 parallelStreams。
-
是的,该集合有 11 个条目,没有空值。为什么建议不要在小情况下使用parallelStream?我确实怀疑这可能与parallelStream有关,但无法准确指出原因。
-
它不会因(普通,串行)流而失败吗?
-
它并不总是下降。即,它不会落在我的机器上,它会落在 QA 机器上,很少,并非总是如此。因此,通过将其移至常规(串行)流,它不会发生,但我仍然无法识别并行流中的问题,
-
如果串行流从来没有发生过,这告诉我你的代码中的某些东西不是线程安全的。这意味着它不会在单线程情况下失败 - 只有在多个线程中运行时。您应该检查您的代码并确保您使用的数据结构都是线程安全的,或者受同步或锁保护。
标签: java nullpointerexception jvm java-8 java-stream