哪些JVM指令不能抛出?

哪些JVM指令不能抛出?,jvm,try-catch,bytecode,Jvm,Try Catch,Bytecode,是否有保证不会抛出的JVM指令 如果我理解正确的话,或多或少地说,VirtualMachineError可以随时抛出。 因此,这两种方法未必在所有情况下都表现相同: int foo() { try { return 1; } catch (Throwable t) { return 2; } } int bar() { return 1; } 是否有任何情况(try块为空的情况除外)可以保证删除try catch后行为保持不变?从理论上讲,一切都可能引发异常。但是这种异常无论如何都是

是否有保证不会抛出的JVM指令

如果我理解正确的话,或多或少地说,
VirtualMachineError
可以随时抛出。 因此,这两种方法未必在所有情况下都表现相同:

int foo() {
  try { return 1; }
  catch (Throwable t) { return 2; }
}

int bar() { return 1; }

是否有任何情况(try块为空的情况除外)可以保证删除try catch后行为保持不变?

从理论上讲,一切都可能引发异常。但是这种异常无论如何都是不可处理的,您最好让异常停止您的应用程序。

您提出了错误的问题。如果您希望抛出一个
VirtualMachineError
,那么无论是否存在
try…catch
,都不能保证行为保持不变

以你为例:

try { return 1; }
catch (Throwable t) { return 2; }
对于此代码,双字节代码指令将有一个异常处理程序
iload_1
ireturn
。这意味着,如果在
iload_1
指令之前或JVM遇到
ireturn
指令之后立即引发
VirtualMachineError
,则不会捕获错误。并且,没有人能够将这种情况与异常处理程序被删除并且在这些指令之间引发错误的情况区分开来

与之相比:

Java虚拟机可能允许在抛出异步异常之前执行少量但有限制的执行。这种延迟允许优化代码在符合Java编程语言语义的情况下,在实际处理异常时检测并抛出这些异常

因此,对于
VirtualMachineError
的情况,没有异常处理程序不会有任何区别,没有人会注意到它,JVM可能会根据代码优化的内部状态延迟错误。另一种情况是,
ireturn
抛出
IllegalMonitorStateException
的可能性


毕竟,问题是你要优化什么。异常处理程序通常不会影响性能,因为只要没有异常需要处理,JVM就不会触及它们。

谢谢。作为一名编译器编写者,我要问的更多:消除这样的处理程序安全吗?我想答案是否定的。虚拟机错误和异步异常的行为显然依赖于实现,所以我不必担心。如果您愿意,可以继续进行优化(只要您不关心调试),谢谢您的回答,Holger,非常有用!阅读“2.10.异常”一章,似乎并非所有的
VirtualMachineError
都是异步的。具体来说,当指令的执行“导致超出资源的某些限制(例如,当使用太多内存时)”时,会引发同步异常。因此,似乎几乎任何指令都可能引发这样的异常—或者您如何确保
iload
不会导致
OutOfMemoryError
iload
只操作当前预分配的堆栈帧。堆栈帧是在方法调用时分配的,验证器的任务是确保任何指令都不能超过声明的堆栈帧大小。因此,
iload
不能导致
OutOfMemoryError
。谢谢你的关注,真的很有帮助!可能重复的