gpt4 book ai didi

java.lang.VerifyError : Stack map does not match the one at exception handler

转载 作者:行者123 更新时间:2023-12-02 08:44:05 26 4
gpt4 key购买 nike

在 JVM 加载字节码期间遇到此 java.lang.VerifyError,代码片段如下。

try{
-----
} catch (NumberFormatException|CalculationException e) {

}

这里CalculationException是扩展java.lang.RuntimeException的自定义异常,而NumberFormatException是标准的Java RuntimeException。虽然代码在本地 Windows 机器上编译并运行良好。

它在 QA/prod/Dev unix 节点之一上失败并出现VerifyError,但在其他 unix 节点上工作正常。虽然两个unix节点具有相同的配置(使用RedHat 6.2和1.8 jdk以及相同版本的jar文件),但也比较了javap -c在两个节点上生成的字节码,发现这是相同的。

我还发现了两种方法可以在错误的节点上解决此问题。

1) 由于此错误是在字节码验证步骤中出现的,因此尝试通过禁用 dev unix 框上的字节码验证为 -Xverify:none (也尝试过 -XX:-UseSplitVerifier 但不起作用,因为我认为它被禁用了JDK 8)然而,由于我们不会在产品中禁用字节码验证,因此一直在寻找其他一些解决方法。

2) 另一种解决方法是在 catch block 中使用父异常:RuntimeException,而不是组合两个异常。

我无法理解Java是否确实存在这种捕获方式的问题,为什么编译器会提示它以及为什么它在一台机器上运行而不是在具有相同配置的其他机器上运行。此外,错误原因没有意义,它表示:CalculationException (当前帧,堆栈[0]) 不可分配给 'java/lang/RuntimeException虽然它实际上是可分配的,经测试

if (RuntimeException.class.isAssignableFrom(CalculationException.class)){
System.out.println("Assisgnable");
}

完整的异常详细信息: 地点:

    com/markit/valuations/marketdata/snapper/domain/credit/BeanWrapperBuilder_CDXOCompositeVolSurface.getSpreadVol(Lcom/markit/valuations/dates/ImmutableDate;Lcom/markit/valuations/marketdata/data/indexeddata/IndexedData;DLcom/markit/valuations/dates/ImmutableDate;Lcom/markit/valuations/dates/ImmutableDate;Ljava/lang/String;Ljava/lang/String;Lcom/markit/qag/analytics/credit/indexpv/swaption/CreditIndexSwaptionCalculator;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Double; @51: astore
Reason:
Type 'com/markit/valuations/common/CalculationException' (current frame, stack[0]) is not assignable to 'java/lang/RuntimeException' (stack map, stack[0])
Current Frame:
bci: @0
flags: { }
locals: { 'com/markit/valuations/marketdata/snapper/domain/credit/BeanWrapperBuilder_CDXOCompositeVolSurface', 'com/markit/valuations/dates/ImmutableDate', 'com/markit/valuations/marketdata/data/indexeddata/IndexedData', double, double_2nd, 'com/markit/valuations/dates/ImmutableDate', 'com/markit/valuations/dates/ImmutableDate', 'java/lang/String', 'java/lang/String', 'com/markit/qag/analytics/credit/indexpv/swaption/CreditIndexSwaptionCalculator', 'java/lang/String', 'java/lang/String' }
stack: { 'com/markit/valuations/common/CalculationException' }
Stackmap Frame:
bci: @51
flags: { }
locals: { 'com/markit/valuations/marketdata/snapper/domain/credit/BeanWrapperBuilder_CDXOCompositeVolSurface', 'com/markit/valuations/dates/ImmutableDate', 'com/markit/valuations/marketdata/data/indexeddata/IndexedData', double, double_2nd, 'com/markit/valuations/dates/ImmutableDate', 'com/markit/valuations/dates/ImmutableDate', 'java/lang/String', 'java/lang/String', 'com/markit/qag/analytics/credit/indexpv/swaption/CreditIndexSwaptionCalculator', 'java/lang/String', 'java/lang/String' }
stack: { 'java/lang/RuntimeException' }
Bytecode:
0x0000000: 2c19 0ab9 0015 0200 b800 cb2b 1906 ba00
0x0000010: cc00 00b6 00cd ba00 ce00 00b6 00cf 1909
0x0000020: ba00 d000 00b6 00cf 0eb8 003b b600 d1c0
0x0000030: 0091 b03a 0cbb 0048 59b7 0049 12d3 b600
0x0000040: 4b19 0ab6 004b 12d4 b600 4b2c 1254 b900
0x0000050: 1502 00b6 004b 12d5 b600 4b29 b600 4c12
0x0000060: d6b6 004b 1907 b600 4b12 d7b6 004b 1905
0x0000070: b600 5b12 d8b6 004b 1906 b600 5b12 d9b6
0x0000080: 004b 190b b600 4b12 dab6 004b 1908 b600
0x0000090: 4bb6 004d 3a0d b200 4719 0d19 0cb9 0081
0x00000a0: 0300 0eb8 003b b0
Exception Handler Table:
bci [0, 50] => handler: 51
bci [0, 50] => handler: 51
Stackmap Table:
same_locals_1_stack_item_frame(@51,Object[#535])

最佳答案

原因

当我的依赖项中同一库 (Jar) 的版本存在冲突时,就会发生这种情况。更具体地说,我导入了不同版本的 Jackson 库 v2.9.10 和 v2.11.0。

疑难解答

以详细模式启动应用程序,并让 java 记录它正在加载的所有类,以查看冲突的类来自何处。这可以通过传递标志 -verbose:class 来完成。

修复

  • 删除冲突版本的依赖项,并确保所有相关依赖项/库(至少)具有相同的主要版本,最好也具有相同的次要版本。
  • 删除可传递导入直接依赖项的冲突版本的依赖项。
  • 如果即使在使用 mvn dependency:tree 后您也没有看到任何冲突的依赖项或 Maven Helper 插件,冲突的依赖项可能已由库的类路径之一导入。我知道这听起来很奇怪,因为只有应用程序应该有类路径,但如果有人添加 <addClasspath>true</addClasspath>在他们的库 pom 文件中,可能会导致这种情况。

关于java.lang.VerifyError : Stack map does not match the one at exception handler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54804355/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com