[英]Java ArrayList Null Pointer
更新,我找到了解決方法: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
。
(不過,嚴重的是,如果您只是在構造函數的開頭放置一個斷點並逐步執行,就會很容易想到這一點。)
DATA_IMAGES.GRASS
添加到TileHelper.MAIN_LIST時為null。
添加GRASS圖像后,您只是在調用DATA_IMAGE.initImages(),因此GRASS圖像在添加時為null。
DATA_IMAGES.initImages();
TileHelper.MAIN_LIST.add(new Tile(DATA_IMAGES.GRASS,100,100));
如果initImages
是靜態初始化塊而不是函數,則可能會更好。 因為它是您需要確保在初始化變量之前使用它的方式。 您檢查過了嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.