参数正确但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
相关产品推荐
相关产品推荐

