gpt4 book ai didi

Java ArrayList 空指针

转载 作者:行者123 更新时间:2023-12-01 07:12:21 25 4
gpt4 key购买 nike

更新我找到了解决方案:D 感谢您的回复,但它们都不是真正的问题。我的问题是,在将图像添加到 ArrayList 后,我​​正在初始化图像。

所以我有一个名为 Tile 的类:

public class Tile {
BufferedImage img;
int x,y;

public Tile(BufferedImage image, int x, int y)
{
this.x = x;
this.y = y;
this.img = image;
}

public int getX(){
return x;
}
public int getY(){
return y;
}
public BufferedImage getImage(){
return img;
}
}

然后我有一个包含图像变量的类,名为 DATA_IMAGES:

public class DATA_IMAGES {
//terrain
public static BufferedImage SNOW;
public static BufferedImage GRASS;
public static BufferedImage CAVE;

//Entities
public static BufferedImage TREE;
public static BufferedImage player;
public static int frame = 1;
public static void initImages(){
try {
player = ImageIO.read(new File("res/images/player/f1.png"));
} catch (IOException e) {
JOptionPane.showMessageDialog(null,"Can't Load Images "+e.getMessage(),"Fatal Error",JOptionPane.ERROR_MESSAGE);
System.exit(0);
}
try{
//SNOW = new ImageIcon("res/images/snow.png").getImage();
//CAVE = new ImageIcon("res/images/snow.png").getImage();
GRASS = ImageIO.read(new File("res/images/grass.png"));

TREE = ImageIO.read(new File("res/images/tree.png"));
}catch(Exception ex){
JOptionPane.showMessageDialog(null,"Can't Load Images","Fatal Error",JOptionPane.ERROR_MESSAGE);
System.exit(0);
}



}
}

所以当我测试这个时,我有一个名为 Main 的类:

public class Main extends JFrame {
private static final long serialVersionUID = 6149918602875295087L;
public static void main(String args[]){
new Main();
}
TileHelper tiles = new TileHelper(TileHelper.MAIN_LIST);
public Main(){
TileHelper.MAIN_LIST.add(new Tile(DATA_IMAGES.GRASS,100,100));
DATA_IMAGES.initImages();
setSize(640,480);
setResizable(false);
setTitle("Stranded");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);

setVisible(true);

createBufferStrategy(2);
GameLoop();
}
public void GameLoop(){
Thread gameloop = new Thread(){
public void run(){
while(true){
RenderInit();
try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
gameloop.start();
}
public void RenderInit(){
BufferStrategy buff = getBufferStrategy();
Graphics g = buff.getDrawGraphics();

g.clearRect(0, 0, getWidth(), getHeight());
g.drawString("COOL TEXT", 100, 100);

Render(g);

g.dispose();
buff.show();
Toolkit.getDefaultToolkit().sync();
}
public void Render(Graphics g){
tiles.RenderAll(g);
}

}

那么您可能会注意到还有一个 TileHelper 类:

public class TileHelper {
ArrayList<Tile> list;
//Main list for adding tiles
public static ArrayList<Tile> MAIN_LIST = new ArrayList<Tile>();

public TileHelper(ArrayList<Tile> list){
this.list = list;
}

public void RenderAll(Graphics g){
for(int i = 0; i < list.size(); i++){
Tile t = new Tile(list.get(i).getImage(), list.get(i).getX(),list.get(i).getY());
g.drawImage(list.get(i).getImage(),t.getX(),t.getY(),null);
System.out.println(t.getX()+" "+t.getY() + list.get(i).getImage().getHeight());
}
}
}

当你仔细观察时,你会发现我打印出了 x 值、y 值和图像高度。我不断收到空指针,因为由于某种原因未设置 BufferedImage?

问题如何解决此问题,以便识别 BufferedImage 并且我不会得到空指针。

这是错误,以防万一您需要它......

Exception in thread "Thread-3" java.lang.NullPointerException
at com.survivalpixel.stranded.TileHelper.RenderAll(TileHelper.java:19)
at com.survivalpixel.stranded.Main.Render(Main.java:60)
at com.survivalpixel.stranded.Main.RenderInit(Main.java:53)
at com.survivalpixel.stranded.Main$1.run(Main.java:35)

最佳答案

public Main(){
TileHelper.MAIN_LIST.add(new Tile(DATA_IMAGES.GRASS,100,100));
DATA_IMAGES.initImages();
// ...

您需要交换这两行。在调用 initImages() 之前,DATA_IMAGES.GRASS 仍为 null

(不过说真的,如果您只是在构造函数的开头放置一个断点并单步执行它,您就可以轻松地弄清楚这一点。)

关于Java ArrayList 空指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11820157/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com