Java二维数组创建对象时触发空指针异常问题求助
解决BreakOut游戏砖块绘制的NullPointerException问题
嗨,我一眼就发现问题出在哪了!你遇到的空指针异常,核心原因是绘制砖块时没有判断数组中的Stone对象是否为null,直接调用了它的方法。
问题根源分析
在你的Level类中,只有当stoneTypes[w][h] >= 1时,才会实例化stones[w][h]为Stone对象;而数组中其他不满足条件的位置,会保持默认的null值。但在Field类的drawStones方法里,你直接遍历整个stones二维数组,对每一个元素都调用getPosition()——碰到那些null的位置,自然就触发NullPointerException了。
修复方案:添加null检查
只需要在绘制逻辑前加一个简单的判断,确认当前位置的Stone对象存在后再执行绘制:
private void drawStones(Graphics2D g2) { stones = view.getGame().getLevel().getStones(); for (int i = 0; i < stones.length; i++) { for (int j = 0; j < stones[i].length; j++) { // 先检查Stone对象是否存在,避免空指针 Stone currentStone = stones[i][j]; if (currentStone != null) { int x_position = (int) currentStone.getPosition().getX(); int y_position = (int) currentStone.getPosition().getY(); g2.fillRoundRect(x_position, y_position, (int) ((double)Constants.SCREEN_WIDTH/Constants.SQUARES_X)-2, (int) ((double)Constants.SCREEN_HEIGHT/Constants.SQUARES_Y)-2, 1, 1); System.out.println(x_position); } } } }
额外建议
- 确认数组维度匹配:检查
stoneTypes的行列数是否和你初始化的stones[25][20]一致,如果JSON读出来的数组维度不一样,可能会导致数组越界或者部分位置未正确初始化。 - 可选优化:用列表存储有效砖块:如果不需要保留空位置的索引信息,可以在Level类里用
List<Stone>来存储所有有效的砖块对象,这样绘制时直接遍历列表,无需判断null,代码会更简洁。
内容的提问来源于stack exchange,提问作者Scoopa
相关产品推荐
相关产品推荐

