2014-03-01 20 views
0

我试图通过paint方法将背景绘制到窗口,它似乎我已成功。但我在控制台上发现了问题。这是“NullPointerException”。线程“AWT-EventQueue-0”中的异常错误

的GameWindow代码:

package com.vboar.game; 

import java.awt.Graphics; 
import java.awt.Toolkit; 
import java.awt.image.BufferedImage; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.JFrame; 

public class GameWindow extends JFrame { 

private List<BackGround> allBg = new ArrayList<BackGround>(); 
private BackGround nowBg = null; 

public GameWindow() { 
    this.setTitle("IGame Beta v1.0"); 
    this.setSize(1000, 600); 
    int width = Toolkit.getDefaultToolkit().getScreenSize().width; 
    int height = Toolkit.getDefaultToolkit().getScreenSize().height; 
    this.setLocation((width - 1000)/2, (height - 600)/2); 
    this.setVisible(true); 
     StaticValue.init(); 
    for (int i = 1; i <= 10; i++) { 
     this.allBg.add(new BackGround(i)); 
    } 
    this.nowBg = this.allBg.get(0); 
    this.repaint(); 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    this.setResizable(false); 
} 

public static void main(String[] args) { 
    new GameWindow(); 
} 

@Override 
public void paint(Graphics g) { 
    BufferedImage image = new BufferedImage(1000,600,BufferedImage.TYPE_3BYTE_BGR); 
    Graphics g2 = image.getGraphics(); 
    g2.drawImage(this.nowBg.getBgImage(), 0, 0, this); 
    g.drawImage(image, 0, 0, this); 
} 
} 


,后台代码:

package com.vboar.game; 

import java.awt.image.BufferedImage; 
import java.util.ArrayList; 
import java.util.List; 

public class BackGround { 
private BufferedImage bgImage = null; 
private int sort; 
public BufferedImage getBgImage() { 
    return bgImage; 
} 
public BackGround(int sort) { 
    this.sort = sort; 
    bgImage = StaticValue.allbgImage.get(0); 
} 
} 

的StaticValue代码:

package com.vboar.game; 

import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 

import javax.imageio.ImageIO; 

public class StaticValue { 
public static BufferedImage blockImage = null; 
public static BufferedImage treeImage = null; 
public static BufferedImage startImage = null; 
public static BufferedImage deadImage = null; 
public static List<BufferedImage> allbgImage = new ArrayList<BufferedImage>(); 
public static List<BufferedImage> alliImage = new ArrayList<BufferedImage>(); 
public static String imagePath = System.getProperty("user.dir") + "/bin/"; 

public static void init() { 
    try { 
     blockImage = ImageIO.read(new File(imagePath + "block.png")); 
     treeImage = ImageIO.read(new File(imagePath + "greentree.png")); 
     startImage = ImageIO.read(new File(imagePath + "startbg.png")); 
     deadImage = ImageIO.read(new File(imagePath + "9.png")); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    for (int i = 1; i <= 8; i++) { 
     try { 
      alliImage.add(ImageIO.read(new File(imagePath + i + ".png"))); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    for (int i = 1; i <= 10; i++) { 
     try { 
      allbgImage.add(ImageIO.read(new File(imagePath + "background" + i + ".png"))); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
} 

完整的异常堆栈跟踪:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException { 
at com.vboar.game.GameWindow.paint(GameWindow.java:41) 
at javax.swing.RepaintManager$3.run(Unknown Source) 
at javax.swing.RepaintManager$3.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source) 
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source) 
at javax.swing.RepaintManager.prePaintDirtyRegions(Unknown Source) 
at javax.swing.RepaintManager.access$1000(Unknown Source) 
at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source) 
at java.awt.event.InvocationEvent.dispatch(Unknown Source) 
at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
at java.awt.EventQueue.access$200(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue.dispatchEvent(Unknown Source) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.run(Unknown Source) 
} 

这是我第一次问的stackoverflow.com使代码可能会非常难看。另外,我不是说英语的人,而且写作很糟糕。你能帮我一个Java学习者来解决这个问题吗?

预先感谢您。

Vboar

回答

1

做一些测试中,它似乎是因为你试图绘制图像没有被第一次尝试绘制窗口上的图像加载你所得到的错误后引起。

错误Swing组件内的处理将处理错误的你,尽管你应该把身边,你绘制图像尝试catch语句自己赶上这个错误,像这样:

try { 
    g2.drawImage(this.nowBg.getBgImage(), x, 0, this); 
} catch (Exception e) { 
    e.printStackTrace(); //optional for seeing the error message 
} 

细算你的代码还有一些其他的建议,可以帮助你完成当前的程序和你的编程技能。

  1. 不必是公共和静态的,除非其 将是最终或只读变量。这是一种通用的编程规则, 适用于多种语言,通常使实施和维护更复杂的程序变得更加困难。

  2. 当您在GameWindow 类中创建背景类时,您基本上复制了StaticValue类中加载的图像。这基本上使得加载时间更长,并且增加了内存使用量而没有增益。尝试只在一个类中加载和使用图像而不是多个。

+0

非常感谢你~~~ _ – Vboar

相关问题