You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java类文件StackMap能否使覆盖super()的构造器异常处理器通过验证?

关于构造器中try-catch与StackMap的验证问题

无法使用StackMap创建覆盖整个构造器(包括super(…))的异常处理器。

我基本认同上述表述,但仍有疑问,因为后续的一条评论提到:

通常,栈帧无需描述之前代码中的内容,只需描述后续代码会用到的内容。

这让我觉得StackMap或许可以省略this实例,只要异常处理器代码不访问它,就能通过验证。具体来说,我知道无法编译以下代码,但假设可以:

public class TryCtor {
    public TryCtor() {
        try {
            super();
        } catch (Error e) {
            throw new RuntimeException();
        }
    }
}

注意,异常处理器中完全没有引用this。对应的类文件字节码如下:

public class TryCtor {
  TryCtor();
    descriptor: ()V
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: goto          16
       7: astore_1
       8: new           #9                  // class java/lang/RuntimeException
      11: dup
      12: invokespecial #11                 // Method java/lang/RuntimeException."<init>":()V
      15: athrow
      16: return
    Exception table:
       from    to  target type
           0     4     7   Class java/lang/Error
}

因此我的问题是:是否可以确定不存在任何StackMap能让此类文件通过验证? 即使指定top、空栈或其他类型?本问题基于使用StackMap的现代JVM版本。

内容的提问来源于stack exchange,提问作者Archie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 10:55:17