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

参数正确但Stage类paint方法报错的技术求助

修复你的Java Paint方法错误

嘿,我来帮你拆解一下你遇到的这几个问题,都是新手常踩的语法和逻辑坑,别着急~

直接导致报错的核心问题

1. 方法嵌套在构造函数里了

你在Stage类的构造函数public Stage()里面直接写了paint方法,这在Java里是完全不允许的!方法不能定义在另一个方法(包括构造函数)内部,编译器根本识别不出这是个合法的方法,这就是你看到paint cannot be resolved to a type报错的根源。

2. Paint方法缺少返回类型

你的paint方法声明写成了public paint(Graphics g, Point mouseLoc),漏掉了返回类型void——因为这个方法不需要返回值,必须明确写上void,否则编译器会把它当成一个非法的类/类型声明,这也是报错的原因之一。

修正后的Stage类代码

把paint方法移到构造函数外面,补上void,同时解决一个潜在的空指针和逻辑错误:

import java.awt.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Stage {
    Grid grid;
    // 用集合存储所有地形,避免单个变量被覆盖的问题
    List<Terrain> terrains = new ArrayList<>();
    Random randomNo = new Random(); // 变量名首字母小写,符合Java命名规范

    public Stage() {
        grid = new Grid();
        for(int i = 0;i<20;i++) {
            for (int j = 0; j < 20; j++) {
                int number = 1 + randomNo.nextInt(10);
                Terrain terrain = null;
                // 修正原逻辑的覆盖问题:原number<=4已经包含1-4,后面的条件永远不会触发
                if (number <= 4) {
                    terrain = new Sand(grid.cellAtColRow(i, j));
                } else if (number == 5) {
                    terrain = new Oasis(grid.cellAtColRow(i, j));
                } else if (number == 6) {
                    terrain = new Wall(grid.cellAtColRow(i, j));
                } else if (number == 7) {
                    terrain = new PalmTree(grid.cellAtColRow(i, j));
                }
                // 生成了地形就加入集合,避免空指针
                if (terrain != null) {
                    terrains.add(terrain);
                }
            }
        }
    }

    // 移到构造函数外部,补上void返回类型
    public void paint(Graphics g, Point mouseLoc){
        grid.paint(g, mouseLoc);
        // 遍历集合绘制所有地形,避免单个变量覆盖导致的丢失
        for (Terrain terrain : terrains) {
            terrain.paint(g);
        }
    }
}

其他需要修正的细节

1. App类中处理鼠标位置的null情况

getMousePosition()在鼠标不在窗口上时会返回null,虽然Cell类里做了处理,但提前处理能避免潜在异常,别忘了调用父类的paint方法防止界面绘制异常:

@Override
public void paint(Graphics g) {
    super.paint(g); // 必须调用父类方法,保证组件绘制正常
    Point mousePos = getMousePosition();
    // 鼠标不在窗口时,设置一个不会触发选中的位置
    if (mousePos == null) {
        mousePos = new Point(-1, -1);
    }
    stage.paint(g, mousePos);
}

2. 变量命名规范

Java里变量名应该首字母小写(比如randomNo而不是RandomNo),这样代码更符合行业规范,也更易读。

最后确认

  • 确保Terrain是所有地形类(Sand、Oasis等)的父类,并且都实现了paint(Graphics g)方法
  • 运行前确认所有类都在同一个包或者正确导入

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 23:17:33