Android Studio开发打砖块游戏碰撞检测时程序崩溃求助
解决打砖块游戏碰撞检测时的空指针崩溃问题
问题根源
从LogCat错误日志可以明确,崩溃原因是**NullPointerException: Attempt to read from null array**,发生在Game.java第124行的循环中——此时你尝试访问的bricks数组为null。
排查与修复步骤
1. 确认Level类中砖块数组的初始化
检查你的Level类代码,确保在填充砖块前已经完成数组的内存分配:
// 在Level类中,先初始化数组再填充元素 public static final int NumOfBricks = 5 * 14; // 70块砖 public Brick[] bricks; // 初始化方法中先分配数组空间 public Level(...) { bricks = new Brick[NumOfBricks]; // 这一步不能少 // 然后再执行你的砖块循环填充逻辑 int id = 0; for (int y = 0; y < 5; y++){ for (int x = 0; x < 14; x++){ int addX = (brickWidth + 10) * x; int addY = (brickHeight + 10) * y; bricks[id] = new Brick(sprite, canvas, (int) positionX + addX, (int) positionY + addY); id++; } } }
如果只声明了Brick[] bricks;但未执行new Brick[NumOfBricks];,数组会保持null状态,后续赋值和访问都会引发错误。
2. 确保Game类中Level实例已完成初始化
检查Game类中level对象的初始化时机:
- 若
level是在UI线程中初始化(比如onCreate方法),而GameLoop是独立线程,可能出现Game.update被调用时level还未初始化完成的情况。 - 可以在
Game的构造方法或初始化阶段提前完成level的实例化,确保调用update时level和level.bricks都不为null。
3. 添加空安全判断(防御性编程)
在Game.update方法中增加空判断,避免因对象未初始化导致的崩溃:
public void update() { // 先判断level和bricks数组是否有效 if (level == null || level.bricks == null) { return; } bricks = level.bricks; for (int i = 0; i < level.NumOfBricks; i++){ Brick brick = bricks[i]; // 额外判断brick对象是否为null if (brick != null && !brick.isDestroyed && ball.collides(brick)){ brick.isDestroyed = true; } } }
4. 验证碰撞检测方法的参数安全性
检查Ball.collides方法,确保传入的target参数不为null时再访问其属性:
public boolean collides(Brick target) { if (target == null) { return false; } if (ballX > target.x + target.width || target.x > ballX + radius / 2){ return false; } if (ballY > target.y + target.height || target.y > ballY + radius / 2){ return false; } return true; }
内容的提问来源于stack exchange,提问作者zygisk123
相关产品推荐
相关产品推荐

