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

JavaSE 6确定赋值规则下编译时常量自赋值的异常行为问询

Java SE 6编译时常量自赋值的异常行为

这确实是Java SE 6里一个挺有意思的边缘案例,涉及到确定赋值规则的漏洞,会触发完全不符合直觉的运行结果。

问题重现与分析

我们先看这个极简的示例代码,直观感受下这个问题:

示例代码(Main.java)

public class Main{
    public static final boolean CONST_TEST = Main.CONST_TEST;
    public static void main(String[] args) {
        System.out.println("CONST_TEST="+ Main.CONST_TEST);
    }
}

编译与运行步骤

  • 编译命令:$ javac Main.java
  • 运行命令:$ java Main

实际输出结果

CONST_TEST=false

按常理来说,这种自引用的常量定义应该触发编译错误,但Java SE 6的编译器居然允许了这种写法,最终返回了布尔类型的默认值false——这就是确定赋值规则的漏洞导致的:编译器错误地判定这个自引用的常量已经完成赋值,实际上它根本没有被初始化,只能返回对应数据类型的默认值。

不同数据类型的表现差异

这个漏洞在不同数据类型上的表现也不一样:

  • 整数类型(int、long等)会返回0
  • 浮点类型(float、double)会返回0.0
  • 引用类型(比如String)会返回null

内容的提问来源于stack exchange,提问作者Andrei Mărcuţ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:41:38