我的tick方法搞砸了

时间:2015-05-30 01:39:14

标签: java indexoutofboundsexception

我创建了一个名为Bullets的类:

public class Bullets {

private double x;
private double y;
private BufferedImage bulletImage;
Bullets(double x, double y){
    this.x = x;
    this.y = y;
    ImageLoader loader = new ImageLoader();
    SpriteSheet ss = new SpriteSheet(loader.loadImage("/Pics/TheSpriteSheet.png"));
    bulletImage = ss.grabImage(2, 1, 32, 32);
}

public void render(Graphics g){
    g.drawImage(bulletImage, (int)x, (int)y, null);
}
public void tick(){
    y--;
}
}

然后我创建了一个名为BulletQualities的类:

package mainPackage;

import java.awt.Graphics;
import java.util.LinkedList;

public class BulletQualities {
Bullets b;
private LinkedList<Bullets> bulletList = new LinkedList<Bullets>();

public void addBullet(Bullets b){
    bulletList.add(b);
}
public void tick(){
    for(int x = 0;x <= bulletList.size();x++){

我在这一行收到错误

        bulletList.get(x).tick();
    }
}
public void render(Graphics g){
    for(int x = 0;x <= bulletList.size(); x++){
        bulletList.get(x).render(g);
    }
}
public void removeBullet(Bullets bullet){
bulletList.remove(bullet);
}
}

然后,在我的Game课程中,我做到了这一点:

Bullets b = new Bullets(playerClass.getX(), playerClass.getY());
BulletQualities bulletQualities = new BulletQualities();
public void init(){
    bulletQualities.addBullet(b);
}
public void render(){
    BufferStrategy bs = this.getBufferStrategy();
    if(bs == null){
        createBufferStrategy(3);
        return;
    }
    Graphics g = bs.getDrawGraphics();
    ////////////////////////////////////////////
    g.drawImage(background, 0, 0, this);
    playerClass.render(g);
    bulletQualities.render(g);
    ////////////////////////////////////////////
    g.dispose();
    bs.show();
}

public void tick(){
    playerClass.tick();

我在这一行收到错误

    bulletQualities.tick();
}

我得到的确切错误是:

线程“Thread-4”中的异常java.lang.IndexOutOfBoundsException:索引:1,大小:1     at java.util.LinkedList.checkElementIndex(Unknown Source)     在java.util.LinkedList.get(未知来源)     在mainPackage.BulletQualities.tick(BulletQualities.java:15)     在mainPackage.Game.tick(Game.java:105)     在mainPackage.Game.run(Game.java:78)     在java.lang.Thread.run(未知来源)

1 个答案:

答案 0 :(得分:2)

您只需要将列表迭代到size-1索引。所以改变这个:

for(int x = 0;x <= bulletList.size();x++){

for(int x = 0;x < bulletList.size();x++){

List在内部将元素存储在一个数组中,一个数组包含从第0个索引到其size-1索引的元素。 任何时候你会尝试获取bulletList.get(x),其中x = list的大小,它将抛出IndexOutOfBoundsException

有更好的方法来迭代Java verion 5.0和abaove中的列表。使用增强的for循环,您将永远不会遇到这种情况。以下是使用增强型for循环转换代码的方法:

for(Bullets bullet:bulletList){
    bullet.tick();
}