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

如何在其他方法中使用main方法内创建的RandomGrid对象

问题分析与解决方案

我来帮你捋清楚当前代码里的核心问题,以及对应的解决办法:

先揪出几个关键问题

  1. 局部变量的访问限制:你在main方法里创建的RandomGrid rGrid是局部变量,非静态的compareGrids方法根本无法直接访问它——这就是你没法在compareGrids里使用rGrid的根本原因。
  2. 错误调用main方法:你在compareGrids里写的ButtonGrid.main(args)和ButtonGrid.main(rGrid)完全不符合语法逻辑:main方法的参数只能是String[],传rGrid会直接编译报错;而且每次调用main都会重新创建ButtonGrid对象,完全没必要,还会造成资源浪费。
  3. 栈溢出的潜在原因:之前把RandomGrid构造放在main外导致栈溢出,大概率是RandomGrid的构造函数里存在无限递归(比如构造里又new了RandomGrid实例),你可以对比ButtonGrid的构造实现,检查RandomGrid里有没有循环创建自身的逻辑。

修改后的代码方案

核心思路是把ButtonGrid和RandomGrid的实例改成类的成员变量,让compareGrids能直接访问到它们:

// 定义类成员变量,让compareGrids可以访问
private static ButtonGrid buttonGrid;
private static RandomGrid rGrid;
// 替换成你实际使用的宽高值
private static final int WIDTH = 10; 
private static final int LENGTH = 10;

public static void main(String[] args) {
    // 初始化成员变量
    buttonGrid = new ButtonGrid(WIDTH, LENGTH);
    rGrid = new RandomGrid(WIDTH, LENGTH);
    
    // 创建类实例并调用compareGrids方法
    YourClass instance = new YourClass();
    instance.compareGrids();
}

public int compareGrids() {
    int numCorrect = 0;
    // 直接使用成员变量里的实例进行比较
    for (int i = 0; i < WIDTH; i++) {
        for (int j = 0; j < LENGTH; j++) {
            // 注意:比较颜色推荐用equals,而非==(Color对象可能是不同实例但颜色值相同)
            if (buttonGrid.grid[i][j].getBackground().equals(rGrid.grid[i][j].getBackground())) {
                numCorrect++;
            }
        }
    }
    System.out.println(numCorrect);
    return numCorrect;
}

额外小提醒

  • 如果ButtonGrid和RandomGrid里的grid是私有变量,记得给它们添加getGrid()这样的 getter 方法,然后把代码改成buttonGrid.getGrid()[i][j]的形式访问。
  • Swing组件的背景色比较,用equals()比==更可靠——==比较的是对象引用,而equals()才是真正比较颜色的数值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:38:46