我面临以下异常:
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)
字节码,堆栈映射表部分是什么意思?我该如何解释它们?
答案 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的更多信息。
我希望这些信息能够为您所寻找的一切提供很好的解释。不要犹豫,要求对任何事物进行更好的解释。