java.lang.VerifyError: Карта стека не совпадает с картой в обработчике исключений - PullRequest
0 голосов
/ 21 февраля 2019

Столкнулся с этим java.lang.VerifyError с фрагментом кода, как показано ниже, во время байт-кода загрузки JVM.

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

}

Здесь CalculationException - это пользовательское исключение, которое расширяет java.lang.RuntimeException, тогда как NumberFormatException является стандартным Java RuntimeException.В то время как код компилируется и работает локально на компьютере Windows.

Он завершается ошибкой с VerifyError на одном из Unix-узлов QA / prod / Dev и отлично работает на других Unix-узлах.Хотя оба unix-узла имеют одинаковую конфигурацию (с использованием RedHat 6.2 и 1.8 jdk и одинаковых версий jar-файлов), они также сравнили байт-код, сгенерированный на обоих узлах с помощью javap -c, и нашли это одно и то же.

Я нашел два способа решенияэто также и на ошибочном узле.

1) Поскольку эта ошибка появляется на этапе проверки байт-кода, попытайтесь отключить проверку байт-кода в окне dev unix как -Xverify: none (также пробовал -XX: -UseSplitVerifier, ноdint work, так как я думаю, что он отключен из jdk 8) Однако, поскольку мы не будем отключать проверку байт-кода в prod, мы искали другой обходной путь.

2) Другой обходной путь - использование родительского исключения: RuntimeException вБлок перехвата вместо объединения двух исключений.

Что я не могу понять, если у Java есть проблема с этим способом перехвата, почему компилятор dint пожаловался на это и почему он работает на одной машине, а не на другой, которая имееттот же конфиг.Кроме того, причина ошибки не имеет смысла, которая гласит: 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])
...