尝试添加到本地初始化的arraylist时出现NullPointerException

时间:2018-05-16 18:41:32

标签: java arraylist

我创建了一个矩形数组来存储我的蛇体。在grow方法中,我创建一个本地ArrayList并初始化它,添加矩形数组的内容。然后我尝试向ArrayList添加新的矩形,但是此时,我收到NullPointerException,我不知道为什么以及如何修复它。我试过在谷歌和这个网站上搜索它,但是我找不到有这个问题的主题。

public class Snake extends GameObject
{
    private Rectangle[] snake;
    private int speed;

    public Snake(int locX, int locY, int width, int height, int speed, ID id) 
    {
        super(locX, locY, width, height, id);
        snake = new Rectangle[3];
        snake[0] = new Rectangle(locX, locY, width, height);
        this.speed = speed;
        grow();
    }

    public void render(Graphics g) 
    {
        g.setColor(Color.GREEN);
        drawSnake(g);               
    }   

    public Rectangle getBounds()
    {
        return new Rectangle(locX, locY, width, height);
    }   

    private void drawSnake(Graphics g)
    {       
        for(int i = 0; i < snake.length - 1; i++)
        {
            g.fillRect(locX, locY, width, height);
        }
    }

    private void grow()
    {
        ArrayList<Rectangle> tempBody = new ArrayList<Rectangle>(Arrays.asList(snake));

        tempBody.add(new Rectangle(snake[snake.length - 1].x, snake[snake.length - 1].y, width, height));   

        snake = tempBody.toArray(snake);
    }   
}

2 个答案:

答案 0 :(得分:4)

原因如下:

  • snake = new Rectangle[3];:您为3 Rectangle创建了一个数组
    1. 所以snake[null, null, null]
  • snake[0] = new Rectangle(locX, locY, width, height);:您在第一个框中填入了一个对象

    1. 所以snake[rect, null, null]
  • snake[snake.length - 1].x您希望获得最后一个框的Rectangle,但请参阅 2。:此框包含null,因此您致电null.x - &gt; NPE

要改进,您可以添加属性size,当您想要grow()时,您将在此处添加一个矩形,如:

private void grow(){
    ArrayList<Rectangle> tempBody = new ArrayList<Rectangle>(Arrays.asList(snake));

    tempBody.add(new Rectangle(snake[size].x, 
                               snake[size].y, width, height));   

    snake = tempBody.toArray(snake);
    size++;
}  

但更好的方法是使用List<Rectangle> snake并且永远不要使用数组(如果可能),因为你需要一个size-mutable元素,所以List是完美的

我建议您添加的Rectangle不会有相同的位置?但在这里你必须决定

答案 1 :(得分:1)

我想提供一个grow()方法的解决方案,它将一个体(矩形)添加到蛇的当前尾部,方法是将它添加到蛇形数组中的下一个空位置,而不会超出其范围。阵列。我假设OP将蛇数组转换为arraylist以获得蛇的当前大小,然后你想使用那个大小 - 1作为你的索引来抓住你的蛇的尾巴以使用它的成员变量为新的身体加入了蛇。

public void grow()
{
    ArrayList<Rectangle> tempBody = new ArrayList<Rectangle>(Arrays.asList(snake));
    if(tempBody.size() < snake.length())
    {
        tempBody.add(new Rectangle(snake[tempBody.size() - 1].x, snake[tempBody.size() - 1].y, width, height));   
        snake = tempBody.toArray(snake);
    }
    else
        System.out.println("Snake at full size: " + snake.length());
}