import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;public class StcokApp extends Frame{
/**
 * 
 */
private static final long serialVersionUID = 1L;
public static StcokApp app;
public Image m_iBuffer;
public Graphics m_gBuffer;

public  static void main(String []arg){
System.out.println("  Welcome StockApp ...");
app = new StcokApp();
app.show();
}

         public void show()
{
m_iBuffer = this.createImage(600, 400);
String str = "Hello World ";

m_gBuffer = m_iBuffer.getGraphics();
m_gBuffer.setColor(Color.black);
m_gBuffer.fillRect(0, 0, 300, 200);

m_gBuffer.setColor(Color.red);
m_gBuffer.setFont(new Font(null, 0, 20));
m_gBuffer.drawString(str, 20, 100);
repaint();
}
}
一运行就会出现如下打印:Exception in thread "main" java.lang.NullPointerException
at com.laohui.StcokApp.show(StcokApp.java:28)
at com.laohui.StcokApp.main(StcokApp.java:21)
为啥会出现空指针了?请各位大侠帮忙分析一下

解决方案 »

  1.   

    你的frame没有显示的时候,createImage返回的是null,所以调用m_gBuffer = m_iBuffer.getGraphics(); 时出现空指针错误了。
    试试看app = new StcokApp();
    app.setVisible(true); //先把frame显示出来
    app.show();
      

  2.   

    刚刚试了一下,得到的是如下打印:
    Exception in thread "main" java.lang.NullPointerException
    at com.laohui.StcokApp.show(StcokApp.java:30)
    at java.awt.Component.show(Unknown Source)
    at java.awt.Component.setVisible(Unknown Source)
    at java.awt.Window.setVisible(Unknown Source)
    at com.laohui.StcokApp.main(StcokApp.java:21)
    还是没有通过,个人认为没有setVisible(true)的话应该只是所画的东西不可见,和创建缓存和画布应该没有太大的关系吧
      

  3.   

    javadoc里有说明的createImage
    public Image createImage(int width,
                             int height)创建一幅用于双缓冲的、可在屏幕外绘制的图像。 参数:
    width - 指定的宽度
    height - 指定的高度 
    返回:
    一幅屏幕外可绘制的图像,可用于双缓冲。如果组件是不可显示的,则返回值可能为 null。如果 GraphicsEnvironment.isHeadless() 返回 true,则始终发生这种情况。
    从以下版本开始: 
    JDK1.0 
    另请参见:
    isDisplayable(), GraphicsEnvironment.isHeadless()
    会不会跟show方法有关,因为这样相当于重写frame的show方法了,你改成别的方法名试试看
      

  4.   

    参考3楼说的,或者看api方法的说明
    加一个语句public void shows() {
    this.show(true);
    m_iBuffer = this.createImage(600, 400);
    .....
      

  5.   

    3楼和5楼的说的很对,把app.setVisible(true)之后再把show函数改个名(应该是和库函数同名了)就OK了,受教了