Java &引用;呼吁;在编辑过程中制作?
最终的错误是,我在抛出异常之前忘记了一条Java &引用;呼吁;在编辑过程中制作?,java,bytecode,instrumentation,java-bytecode-asm,jvm-crash,Java,Bytecode,Instrumentation,Java Bytecode Asm,Jvm Crash,最终的错误是,我在抛出异常之前忘记了一条pop指令。(抛出异常之前的最后一条指令是一个已成功的checkcast,Java不希望其结果仍在堆栈上。) [此外(应该是显而易见的,但我意识到我的话可能会令人困惑):在执行错误代码的过程中没有引发异常(因为代码仍在编译且未执行),但是checkcast之后的下一条指令相当于引发异常。] 但我很好奇,这是如何导致这个错误消息的 # A fatal error has been detected by the Java Runtime Environmen
pop
指令。(抛出异常之前的最后一条指令是一个已成功的checkcast
,Java不希望其结果仍在堆栈上。)
[此外(应该是显而易见的,但我意识到我的话可能会令人困惑):在执行错误代码的过程中没有引发异常(因为代码仍在编译且未执行),但是checkcast
之后的下一条指令相当于引发异常。]
但我很好奇,这是如何导致这个错误消息的
# A fatal error has been detected by the Java Runtime Environment:
#
# Internal Error (javaCalls.cpp:64), pid=3560, tid=140207058839296
# guarantee(!thread->is_Compiler_thread()) failed: cannot make java calls from the compiler
#
# JRE version: Java(TM) SE Runtime Environment (7.0_65-b17) (build 1.7.0_65-b17)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (24.65-b04 mixed mode linux-amd64 compressed oops)
编译器认为它正在尝试进行什么类型的“调用”?此消息在此处生成:。这可能对你有帮助,我不明白。
checkcast
指令的结果与前面的对象引用相同,只是类型不同,通常更具体。如果它不是您要抛出的可丢弃对象,为什么要抛出它,或者如果它是可丢弃对象,为什么要pop
它,而且无论如何,如果类型不匹配,验证器不应该拒绝它吗?如果无效代码通过了验证器,无论是bug还是显式关闭,讨论随后的JVM崩溃都没有意义。@Holger这是一系列类型检查的一部分。对于某些类型,我想抛出一个专用的异常(将被捕获并进一步处理),对于其他类型,我想对我刚刚抛出的对象执行一些特定于类型的操作。这仍然不能解释它。如果类型不匹配,checkcast
后跟pop
将抛出一个ClassCastException
。如果您在抛出异常之前直接放置它,那么无论哪种情况,您都是在抛出异常,而不是“对对象执行特定于类型的操作”。而且,athrow
需要在堆栈上设置一个可丢弃项。在checkcast
之前推送throwable没有任何意义,但是当您在checkcast
之后推送throwable时,堆栈上是否有其他项是完全无关的。
cannot make java calls from the compiler