【问题标题】:java.lang.VerifyError: Expecting a stackmap frame at branch target 5java.lang.VerifyError:在分支目标 5 处期望堆栈图帧
【发布时间】:2021-03-26 04:34:55
【问题描述】:

我正在开发我的公司项目。

我有 2 张桌子。我通过 OneToMany - ManyToOne 关系连接到这些表。 我正在使用 postgreSql。

@OneToMany(fetch = FetchType.LAZY)
private Set<TblAgentParameters> tblAgentParameters;


@JoinColumn(name = "TBL_AGENT_PROPERTY_PARAMETERS_ID")
@ManyToOne(fetch = FetchType.LAZY)
private TblAgentPropertyParameters tblAgentPropertyParametersList;

但是我得到了这个错误。

原因:java.lang.VerifyError: Expecting a stackmap frame at branch target 5 异常详情: 地点: com/karcin/template/persistence/entities/TblAgentPropertyParameters.class$(Ljava/lang/String;)Ljava/lang/Class; @0:aload_0 原因: 此位置的预期堆栈图帧。 字节码: 0x0000000: 2ab8 00ef b04c bb00 f159 2bb6 00f6 b700 0x0000010: f8bf
异常处理表: bci [0, 5] => 处理程序:5

    at java.lang.Class.forName0(Native Method)[:1.8.0_271]
    at java.lang.Class.forName(Class.java:264)[:1.8.0_271]
    at com.karcin.template.persistence.entities.TblAgentParameters.class$(TblAgentParameters.java)[79:karcin-template-persistence:1.0.0.SNAPSHOT]
    at com.karcin.template.persistence.entities.TblAgentParameters.<clinit>(TblAgentParameters.java)[79:karcin-template-persistence:1.0.0.SNAPSHOT]
    at java.lang.Class.forName0(Native Method)[:1.8.0_271]
    at java.lang.Class.forName(Class.java:264)[:1.8.0_271]
    at com.karcin.template.web.controllers.ApiController.getEntityClass(ApiController.java:154)[82:karcin-template-web:1.0.0.SNAPSHOT]
    at com.karcin.template.web.controllers.ApiController.test(ApiController.java:101)[82:karcin-template-web:1.0.0.SNAPSHOT]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)[:1.8.0_271]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)[:1.8.0_271]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)[:1.8.0_271]
    at java.lang.reflect.Method.invoke(Method.java:498)[:1.8.0_271]
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)[144:org.apache.servicemix.bundles.spring-web:3.2.18.RELEASE_1]
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)[144:org.apache.servicemix.bundles.spring-web:3.2.18.RELEASE_1]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:743)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:672)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:82)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:933)[146:org.apache.servicemix.bundles.spring-webmvc:3.2.18.RELEASE_1]
    ... 27 more

我该如何解决这个问题?

【问题讨论】:

  • 您使用的 Spring 版本似乎与 JVM 的要求不匹配。正确的答案可能是更新 Spring。
  • 感谢您的回复。 (:

标签: java postgresql


【解决方案1】:

某些东西生成了字节码。某些东西要么是 [A] 出了问题,并且在这里搞砸了,产生了一个无效的类文件,要么是 [B] 非常旧1

修复方法是修复出错的代码。如果那不是您的代码,则向库提交错误。如果没有人再维护它,¯\_(ツ)_/¯,你就不走运了。

无效的类文件是com/karcin/template/persistence/entities/TblAgentPropertyParameters.class

[1] 您可能不需要了解的技术细节:十多年前,Java 类文件格式进行了一些更改,以在类文件本身中添加一些关于堆栈帧的提示。验证器是检查类文件是否“有效”的东西,并且执行类文件不会导致 C 编码人员倾向于称之为“核心转储” - 一个会破坏系统安全性并导致您的程序会立即被您的操作系统硬杀死,或者如果操作系统无法检测到它,则会出现安全问题。 Java 承诺这不会发生,并且类验证器是其中的一部分。类验证器通过类文件中的堆栈帧注册得到帮助:验证此堆栈帧信息是否正确,然后验证字节码是否只访问允许访问的内存,much比验证字节码只访问允许在没有此信息的情况下访问的内存更简单、更快捷。允许较旧的类文件没有此注册,在这种情况下,验证者会为您添加它(但这需要很多时间,这就是为什么更现代的类文件需要它的原因)。因此,我们实际上仍然处于错误的领域:无论使该类文件放置的类文件版本足够高,以至于堆栈框架注释是必需,但没有添加它们,并且因此验证者拒绝类文件。或者,因为这是 10 多年前的新闻,也许现在非常现代的 VM 不再能够运行非常旧的类文件,因为此时“计算堆栈框架”代码已被删除。如果是这种情况,降级回 JDK8 可能会奏效,但您确实需要解决这个问题;您运行的代码已经过时了 10 年以上。

【讨论】:

  • 感谢您的回复。 (((:我很高兴这个回应。(:谢谢。
猜你喜欢
  • 2014-12-31
  • 2014-10-22
  • 2014-09-19
  • 1970-01-01
  • 2013-02-13
  • 2017-02-22
  • 1970-01-01
  • 2017-01-07
相关资源
最近更新 更多