首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 8 lambda -运行时错误

Java 8 lambda -运行时错误
EN

Stack Overflow用户
提问于 2017-02-16 12:34:50
回答 1查看 999关注 0票数 1

我们在我们的项目中有下面的代码,虽然它工作得很好,但是随机的,我们在运行时得到了类def not fine error。我们的App服务器会在每个星期天重新启动,所以有时我们会在任意服务器实例上收到此错误。服务器重启解决了这个问题,但没有任何线索说明为什么类加载会中断。

我在这个问题中遇到了类似的错误,这个问题似乎已经在JDK9 Transforming lambdas in Java 8中得到了解决

但在我得出结论之前,有人能解释一下这是相同类型的错误,以及为什么它偶尔会发生。

代码语言:javascript
复制
public boolean isAttachmentExpired(final Document_Attachment da) {
    return this.bcDocumentScreen.getValidator().getAttachmentsValidator().isAttachmentExpired(da);
}

public boolean isAttachmentWarningShown() {
    return CollectionUtils.isNotEmpty(getAttachments()) && getAttachments().stream().anyMatch(this::isAttachmentExpired);
}

public boolean isAttachmentExpired(final Document_Attachment da) {
        final Date today = DateHelper.today();
        return DateHelper.diffInYears(today, da.getUploaded()) >= 1;
    }

错误:-

代码语言:javascript
复制
Caused by: java.lang.reflect.InvocationTargetException
        at sun.reflect.GeneratedMethodAccessor1913.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.jboss.seam.util.Reflections.invoke(Reflections.java:22)
        at org.jboss.seam.intercept.RootInvocationContext.proceed(RootInvocationContext.java:32)
        at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:56)
        at org.jboss.seam.core.BijectionInterceptor.aroundInvoke(BijectionInterceptor.java:79)
        at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68)
        at org.jboss.seam.persistence.ManagedEntityInterceptor.aroundInvoke(ManagedEntityInterceptor.java:48)
        at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68)
        at org.jboss.seam.transaction.RollbackInterceptor.aroundInvoke(RollbackInterceptor.java:28)
        at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68)
        at org.jboss.seam.core.MethodContextInterceptor.aroundInvoke(MethodContextInterceptor.java:44)
        at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68)
        at org.jboss.seam.intercept.RootInterceptor.invoke(RootInterceptor.java:107)
        at org.jboss.seam.intercept.JavaBeanInterceptor.interceptInvocation(JavaBeanInterceptor.java:196)
        at org.jboss.seam.intercept.JavaBeanInterceptor.invoke(JavaBeanInterceptor.java:114)
        at com.XXX.BcdAttachmentsSection_$$_javassist_seam_91.isAttachmentWarningShown(BcdAttachmentsSection_$$_javassist_seam_91.java)
        at sun.reflect.GeneratedMethodAccessor1912.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at javax.el.BeanELResolver.getValue(BeanELResolver.java:363)
        at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
        at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
        at org.jboss.el.parser.AstPropertySuffix.getValue(AstPropertySuffix.java:53)
        at org.jboss.el.parser.AstValue.getValue(AstValue.java:67)
        at org.jboss.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
        at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
        ... 122 more
Caused by: java.lang.NoClassDefFoundError: com/XXX/docsections/BcdAttachmentsSection$$Lambda$75
        at com.XXX.BcdAttachmentsSection$$Lambda$75/1736532374.get$Lambda(Unknown Source)
        at com.XXXX.isAttachmentWarningShown(BcdAttachmentsSection.java:51)
        ... 150 more
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-16 18:38:02

如果涉及到插装,则the bug, you have linked很有可能适用。考虑一下这个bug,JDK-8027681, “Lambda serialization fails once reflection proxy generation kicks in”,它影响了所有执行超过16次的反射操作(这是一个可配置的阈值),因为底层实现将通过生成一个访问器类来优化后续调用,这个访问器类由HotSpot可以内联的字节码组成。此字节码无法访问Java 8早期版本中为lambda表达式生成的匿名类。

虽然此bug已经修复,但所描述的在一定数量的调用后生成类的行为仍然存在,因此,如果代理尝试检测这些生成的类,它将由于仍然存在的Instrumentation bug而失败,并且对调用数量的依赖性可能是这种情况仅偶尔发生的原因。

虽然Instrumentation/JVM中的这个bug应该得到修复(并将在下一个版本中得到修复),但它也有助于避免尝试检测这些类。通常,应该没有理由插装这些内部帮助器类。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42265044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档