如何阅读此信息?

时间:2019-04-02 15:39:02

标签: java exception

我面临以下异常:

Caused by: java.lang.VerifyError: Bad return type
Exception Details:
  Location:
    com/company/MyClass.getProperty(Ljava/lang/String;)Ljava/lang/Object; @93: ireturn
  Reason:
    Type integer (current frame, stack[0]) is not assignable to 'java/lang/Object' (from method signature)
  Current Frame:
    bci: @93
    flags: { }
    locals: { 'com/company/MyClass', 'java/lang/String', 'java/lang/String' }
    stack: { integer }
  Bytecode:
    0x0000000: 2b01 a600 0812 8da7 0007 2bb6 0090 4d2c
    0x0000010: b600 94ab 0000 0064 0000 0007 9a7f 0d13
    0x0000020: 0000 005f 9b27 5edf 0000 004b 0000 fc71
    0x0000030: 0000 0041 0023 a6ed 0000 005a 03b3 b10f
    0x0000040: 0000 0046 34ad f045 0000 0055 7a92 a99e
    0x0000050: 0000 0050 2ab6 0096 b02a b600 98ac 2ab6
    0x0000060: 009a b02a b600 9cb0 2ab6 009e b02a b600
    0x0000070: a0b0 2ab6 00a2 b0bb 0079 59bb 007b 59b7
    0x0000080: 007c 12a4 b600 822c b600 82b6 0086 b700
    0x0000090: 88bf                                   
  Stackmap Table:
    same_frame(@10)
    same_locals_1_stack_item_frame(@14,Object[#101])
    append_frame(@84,Object[#101])
    same_frame(@89)
    same_frame(@94)
    same_frame(@99)
    same_frame(@104)
    same_frame(@109)
    same_frame(@114)
    same_frame(@119)

at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348) 

字节码,堆栈映射表部分是什么意思?我该如何解释它们?

1 个答案:

答案 0 :(得分:1)

以下是整个邮件的明细:


Caused by: java.lang.VerifyError: Bad return type

这将告诉您异常是什么(java.lang.VerifyError)和与之相关的错误消息(Bad return type)。您可以使用异常类型来确定对异常的基本了解(例如,如果它是NullPointerException,则可以告诉您存在某种被引用的空对象),但是您需要使用异常消息,以更好地了解为什么会引发异常。看起来您好像在尝试返回与方法定义指定的类型不同的类型。


  Location:
    com/company/MyClass.getProperty(Ljava/lang/String;)Ljava/lang/Object; @93: ireturn

这会告诉您异常发生的位置。您可以在com.company.MyClass方法getProperty的类中确认它发生了。它还告诉您方法的参数为String,返回类型为Object@93: ireturn指的是Java字节码,我将在后面讨论。


  Reason:
    Type integer (current frame, stack[0]) is not assignable to 'java/lang/Object' (from method signature)

这将为您提供引发异常的原因的更具体原因,并告诉您原因。它告诉您不能为Object分配一个整数(这可能是因为您试图返回一个int原语,而该原语不继承Object类型)。


  Current Frame:
    bci: @93
    flags: { }
    locals: { 'com/company/MyClass', 'java/lang/String', 'java/lang/String' }
    stack: { integer }

本节介绍当前帧。为此,我们必须研究Java的实际工作方式。当您使用Java编译某些代码时,它将变成Java字节码。除了只能在JVM或Java虚拟机上运行之外,这与常规程序集相似。在此虚拟机上,创建了frame,其中包含所有本地信息。我对这些信息的细节并不完全了解,但是据我所知,bci标签包含字节码中的当前位置。 locals告诉Java将哪些类加载到当前作用域,而stack的确是听起来像的。基本上,它只是一堆值的列表。


  Bytecode:
    0x0000000: 2b01 a600 0812 8da7 0007 2bb6 0090 4d2c
    0x0000010: b600 94ab 0000 0064 0000 0007 9a7f 0d13
    0x0000020: 0000 005f 9b27 5edf 0000 004b 0000 fc71
    0x0000030: 0000 0041 0023 a6ed 0000 005a 03b3 b10f
    0x0000040: 0000 0046 34ad f045 0000 0055 7a92 a99e
    0x0000050: 0000 0050 2ab6 0096 b02a b600 98ac 2ab6
    0x0000060: 009a b02a b600 9cb0 2ab6 009e b02a b600
    0x0000070: a0b0 2ab6 00a2 b0bb 0079 59bb 007b 59b7
    0x0000080: 007c 12a4 b600 822c b600 82b6 0086 b700
    0x0000090: 88bf 

这告诉您程序的原始字节码。这就是JVM正在读取的内容,并且与汇编代码密切相关。您可以查看Bytecode Viewer来尝试以更易于理解的形式查看字节码。


  Stackmap Table:
    same_frame(@10)
    same_locals_1_stack_item_frame(@14,Object[#101])
    append_frame(@84,Object[#101])
    same_frame(@89)
    same_frame(@94)
    same_frame(@99)
    same_frame(@104)
    same_frame(@109)
    same_frame(@114)
    same_frame(@119)

Stackmap表从本质上告诉Java方法在执行过程中预期的变量类型和操作数类型。您可以了解有关here的更多信息。


我希望这些信息能够为您所寻找的一切提供很好的解释。不要犹豫,要求对任何事物进行更好的解释。