Java静态变量运行结果不一致:BlueJ两次输出不同是否为Bug?
问题复现与原因说明
你遇到的运行结果差异本质是不同IDE运行Java程序时的JVM进程策略不同导致的,结合你给出的更新信息,具体分析如下:
现象还原
你给出的测试代码如下:
public class Bug { private static int x = 0; public static void main(String[] args){ System.out.println("\f"); System.out.println(x); x=5; System.out.println(x); } }
Java中静态变量的初始化仅在类首次被加载时执行一次,只要类不被卸载、JVM进程不重启,静态变量的取值会一直保留。
首次运行所有IDE都会输出0和5,第二次运行时出现差异:
- Coding Rooms IDE每次运行都会启动独立的JVM进程,类会重新加载,静态变量
x会重新初始化为0,输出结果符合Java规范,为0和5 - BlueJ在安装了「Run Main Method」扩展时,复用同一个JVM进程运行main方法,类只会加载一次,静态变量
x的取值会保留上一次运行的修改,因此第二次运行输出5和5
结论
这不是BlueJ核心功能的Bug,是第三方扩展「Run Main Method」的实现逻辑不符合预期导致的,该扩展没有遵循常规IDE每次运行启动独立JVM的设计,复用进程导致静态变量状态残留。
解决方案
- 禁用或卸载「Run Main Method」扩展
- 使用BlueJ原生的标准
void main(String[] args)入口触发程序运行,即可得到符合规范的预期结果 - 如果需要保留该扩展,每次运行涉及静态变量的代码前可以重新编译对应类,触发类重新加载重置静态变量状态
内容的提问来源于stack exchange,提问作者DCR
相关产品推荐
相关产品推荐

