由于您是指JVMS,因此我假设您是在寻求正式答案,而正式答案是您的问题实际上没有任何意义。:-)
询问JVM 如何 执行Java源代码片段就像询问数学家 正确 的10 + 10计算方式。数学家可能会说类似“ 未定义 如何
计算”之类的内容。同样,定义Java代码段含义的JLS也没有详细说明 如何 执行它。
因此,首先让我稍微形式化一下您的问题:“在与给定Java代码段相对应的 字节码中
(由的引用实现发出
javac)会
VirtualMachineErrors出现在哪里?”
这个问题可以说很容易回答。JVMS的相关部分说
VirtualMethodError当内部错误或资源限制使Java虚拟机实现无法实现本章中描述的语义时,将抛出一个对象,该对象是该类的子类的实例。该规范无法预测可能会遇到内部错误或资源限制的位置,并且无法准确地报告何时可以报告它们。
因此,答案是:在任何两个字节码指令之间。
现在回到您的原始问题:例如,此片段
try { // nothing} catch (java.lang.Throwable e) { // which Throwable subclass might we see?}被编译为空程序,该程序无法合理地引发任何异常。
关于您在评论中的后续问题:
是否应将JLS 11.1.3理解为“
Throwable除非是的子类,否则保证在字节码之间不出现VirtualMachineError”
的子类?
是的,你可以这样说。我的措词可能会有所不同:任何指令都会引起
- JVM指令集为相关指令指定的异常,
- 类型的任何例外
VirtualMachineError
- 没有其他例外



