我实际上早些时候问了这个问题,但我不得不编辑它,我觉得我已经太迟了,因为在那之后没有人回答。
我正在开发一款小型街机视频游戏,我正在寻找双缓冲来改善动画效果。我有一个类应该绘制空白图像,另一个类应该绘制一个简单的线。但是,我一直在应该绘制线的行上得到NullPointerException
class Render extends JPanel {
public int dbWidth = 500, dbHeight = 400;
public Image dbImage = null;
public Graphics dbg;
public void gameRender() {
if( dbImage == null )
dbImage = createImage( dbWidth, dbHeight );
dbg = dbImage.getGraphics();
dbg.setColor( Color.white );
dbg.fillRect( 0, 0, dbWidth, dbHeight );
}
}
class MC extends Render {
public Render render = new Render();
public void draw() {
render.gameRender();
dbg.drawLine( 100, 100, 200, 200 ); // line where NullPointerException occurs
}
}
我想这是图形变量dbg是null,但它在dbImage.getGraphics();
中得到gameRender();
的值我怎么能解决这个NullPointerException?
我也在另一个类中调用draw()方法,比如
public void run() {
running = true;
while( running ) {
mc.draw();
try {
Thread.sleep( 50 );
}
catch( Exception e ) {}
}
}
我在那个类的构造函数中说过mc = new MC();
答案 0 :(得分:3)
类MC
扩展了类Render
。这意味着MC
会继承Render
的{{1}}字段。您无需创建dbg
的另一个实例。试试这个:
Render
答案 1 :(得分:1)
您在这里处理了Render
的两个实例:render
类中有一个MC
字段,而且MC
本身延伸Render
,那里有另一个隐含的例子。当你这样做时:
render.gameRender();
您在实例上调用gameRender
,初始化render.dbg
,但是当您致电dbg.drawLine
时,您正在使用MC
dbg
的{{1}}实例尚未初始化。
在这种情况下,您确实不需要继承,因此只需render
字段即可:
public void draw() {
render.gameRender();
render.dbg.drawLine( 100, 100, 200, 200 );
}
此外,将字段设为公开是不好的做法,因此请考虑在dbg
中为Render
添加一个getter:
public Graphics getGraphics() {
return dbg;
}
...
render.getGraphics().drawLine( 100, 100, 200, 200 );
或委托drawLine
来电:
public void drawLine(int x1, int y1, int x2, int y2) {
dbg.drawLine(x1, y1, x2, y2);
}
...
render.drawLine( 100, 100, 200, 200 );
答案 2 :(得分:0)
我想在调用构造函数之前,java绘图环境会调用draw方法。
在构造函数中放置一个断点,在draw()中放置一个断点来验证这一点。
如果那是真的,只需用if来检查draw语句!= null。当然这是一种解决方法,但也许它可以帮到你。