错误就是NullPointer....
没有了

解决方案 »

  1.   

    你要看一看image对象创建了没有,也就是说存不存在"face/face1.gif"文件,不过我没试!
      

  2.   

    这个是文件是存在的
    不过对于image对象的创建还是有点疑虑,,,不知道是不是这样创建??
    能不能说一下??
      

  3.   

    通常是用这个 Toolkit.getDefaultToolkit().createImage(src);
      

  4.   

    我用的是Toolkit.getDefaultToolkit().getImage(src);
    有什么区别么?
    例子中写错了
    getImage()和createImage()方法的区别能说说么?
      

  5.   

    倒数第4行: Thread.sleep(500); 改成 Thread.currentThread().sleep(500)试试如果还出同样的错,可能在JForm.show()调用以前,getGraphics()返回null。
    //我也没调试你贴上来的程序。只是猜测。
      

  6.   

    更正:
    我把JFrame写成JForm了
      

  7.   

    以下是我基于你的代码稍加修改的结果,在我这里可以实现图像的跳动。
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    public class Demo extends JFrame{
        private JumpGra jg;
        public Demo(){
            jg=new JumpGra();        
            getContentPane().add(jg);
            addWindowListener(new WindowAdapter(){
                  public void windowClosing(WindowEvent e){
                      System.exit(0);
                  }
              });
            setSize(200,200);
    show();
    jg.start();

        }
        
        public static void main(String[] args){
              JFrame j=new Demo();
        }
    }      class JumpGra extends JLabel implements Runnable{
      private Image image;
      private int x=40,y=40;
      private boolean b=true;
      Thread t;
      public JumpGra(){
              image=new ImageIcon("images/1.gif").getImage();
              t=new Thread(this);
      }
      public void paint(Graphics g){
         if (image!=null) {
              g.drawImage( image,x,y,this);
            }
      }
      public void jump(){
       if (b) {
       if (x==40) {
       x=42;
       y=42;
       }
       else 
       {
       x=40;
       y=40;
       }
        }
    }
        public void start(){
         t.start();
      
        } public void run() {
              while(true){
                   try{ 
                  jump();
                  repaint();
                      t.sleep(200);
                  }catch(Exception e){}
            } }
    }
    如果你想要实现你的跳动上的细节上的感觉可以修改jump方法。
      

  8.   

    import javax.swing.*;
    import java.awt.event.*;
    import java.awt.*;public class Demo extends JFrame{
        private JPanel jPanel;
        private JumpGra jg;
        public Demo(){
            jPanel=new JPanel();
            jg=new JumpGra(jPanel);                getContentPane().setLayout(null);
            getContentPane().add(jPanel);
            jPanel.setBounds (50,50,40,40);
            jg.jump();
          
            addWindowListener(new WindowAdapter(){
                  public void windowClosing(WindowEvent e){
                      System.exit(0);
                  }
              });
              
            setSize(200,200);
        }
        public static void main(String[] args){
              JFrame j=new Demo();
              j.show();
        }      
    }
    class JumpGra{
      private JPanel jPanel;
      public Image image;
      public int x=0,y=5,dx=1,dy=1;
      public boolean b=true;
      public JumpGra(JPanel j){
              jPanel=j;
              image=Toolkit.getDefaultToolkit().getImage("face/face1.gif");
      }
      public void draw(){
              Graphics g=jPanel.getGraphics();
              g.drawImage( image,x,y,32,32,null);
              g.dispose();
      }
      public void move(){
              Graphics g=jPanel.getGraphics();
              g.drawImage(image,x,y,32,32,null);
              if(b){
                  if(x<5){
                        x+=dx;
                        y-=dy;
                  }
                  else if(x<10&&x>4){
                        x+=dx;
                        y+=dy;
                        if(x==10){b=false;}
                  }
    }
              else{
                if(x<5){        
                        x-=dx;
                        y+=dy;
                        if(x==0){b=true;}
                  }
                else if(x<10&&x>4){
                        x-=dx;
                        y-=dy;
                        
                }
            }
            g.drawImage(image,x,y,32,32,null);
            g.dispose();
        }
    public void jump(){
              draw();
              while(true){
                  move();
                  try{ 
                      Thread.currentThread().sleep(500);
                  }catch(Exception e){}
              }
        }
    }
    修改这个程序。。前面那个有些编译方面的错误
    这一个没有
    运动三角的三个点坐标为(0,5)(5,0)(10,5)编译通过运行错误如下:
    Exception in thread "main" java.lang.NullPointerException
            at JumpGra.draw(Demo.java:41)
            at JumpGra.jump(Demo.java:74)
            at Demo.(init)<Demo.java:15)
            at Demo.main(Demo.java:26)
    哪位高人能指点一二,多谢
      

  9.   

    cherami(cherami):
    有一点奇怪为什么要在JumpGra类里面重载start()方法
    是不是不必
    好像t是多余的?
    直接在try里面用sleep(200)就可以了吧?
      

  10.   

    这个程序改得匆忙,有很多问题。
    在JumpGra类里面重载start()方法主要是为了给JFrame提供一个启动接口。
    加入线程t的原因是一般都是这样构造的,将一个Runnalbe对象作为Thread的构造方法的参数。
    如果直接使用sleep而不实现Runnable的话我担心sleep的是整个程序而不是该组件,因为从你的程序来看只有一个线程在运行。
      

  11.   

    你的程序的问题出在draw和jump方法中的Graphics g=jPanel.getGraphics();得到的是一个空对象。也就是说g为null.