java.lang.NullPointerException错误?

时间:2014-04-10 04:01:07

标签: java

当椭圆形的子弹击中它时,我正在使用碰撞检测红色矩形。但是当我尝试运行时,它会给我这些错误。当我按下SPACE时,子弹才会出现。我想测试它,以便在创建简单游戏时可以使用它。

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class JavaGame2 extends JPanel implements KeyListener,Runnable{

//variables
JFrame frame;
int x, y, xDir, yDir,bx,by;
Rectangle bullet;
boolean readyTofire, shot = false;


//constructor for game
public JavaGame2(){

    frame = new JFrame("Java Game");
    int x=150;
    int y=150;


}



//drawings
public void paintComponent(Graphics g){

    super.paintComponent(g);
    this.setBackground(Color.WHITE);

    Rectangle rec = new Rectangle(50, 20, 50, 50);
    g.setColor(Color.BLUE);
    g.fillOval(x, y, 55, 55);
    g.fillRect(x+23, y-15, 10, 20);
    g.setColor(Color.RED);
            g.fillRect(rec.x, rec.y, rec.width, rec.height);


    if(shot){
        g.setColor(Color.BLACK);
        g.fillRect(bullet.x, bullet.y, bullet.width, bullet.height);
    }


            //this collision part is giving me an error********************
    if(bullet.intersects(rec));
        g.drawString("collision!", 50, 20);


             repaint();

}

public void setxDir(int xdir){
    xDir = xdir;
}
public void setyDir(int ydir){
    yDir = ydir;
}



//key event listener keypressed

public void keyPressed(KeyEvent e) {
    int code = e.getKeyCode();
    if(code == KeyEvent.VK_UP){
        setyDir(-1);
     }
     if(code == KeyEvent.VK_DOWN){
        setyDir(+1);
     }
     if(code == KeyEvent.VK_LEFT){
        setxDir(-1);
     }
     if(code == KeyEvent.VK_RIGHT){
        setxDir(+1);

     }
     if(code == KeyEvent.VK_SPACE){
        if(bullet == null ){

            readyTofire = true;
            if(readyTofire){
                bx = x+26;
                by = y-15;
                bullet = new Rectangle(bx, by, 5, 3);
                shot = true;

            }

        }
     }
}

//key event listener for key released
public void keyReleased(KeyEvent e) {
    int code = e.getKeyCode();
    if(code == KeyEvent.VK_UP){
        setyDir(0);
     }
     if(code == KeyEvent.VK_DOWN){
        setyDir(0);
     }
     if(code == KeyEvent.VK_LEFT){
        setxDir(0);
     }
     if(code == KeyEvent.VK_RIGHT){
        setxDir(0);

     }
     if(code == KeyEvent.VK_SPACE){
         readyTofire = false;
         if(bullet.y <= -5){
             bullet = new Rectangle(0, 0, 0, 0);
             shot = false;
             readyTofire = true;

         }
     }
}

public void keyTyped(KeyEvent e) {

}

//shot of bullet
public void shoot(){

    if(shot){
        bullet.y--;
    }

}

//movement of the oval
public void move(){
    x += xDir;
    y += yDir;
    if(x <= 0){
        x = 0;
    }
    else if(x >= 500){
        x = 500;
    }
    else if(y <= 0){
        y = 0;
    }
    else if(y >= 500){
        y = 500;
    }

}

//thread
public void run() {

    try{
        while(true){
            shoot();
            move();



            Thread.sleep(5);
        }

    }
    catch(Exception e){
        System.out.println("error!");
    }
}




}

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at JavaGame2.paintComponent(JavaGame2.java:47)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JLayeredPane.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paintToOffscreen(Unknown Source)
at javax.swing.BufferStrategyPaintManager.paint(Unknown Source)
at javax.swing.RepaintManager.paint(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at java.awt.GraphicsCallback$PaintCallback.run(Unknown Source)
at sun.awt.SunGraphicsCallback.runOneComponent(Unknown Source)
at sun.awt.SunGraphicsCallback.runComponents(Unknown Source)
at java.awt.Container.paint(Unknown Source)
at java.awt.Window.paint(Unknown Source)
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$1100(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)
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at JavaGame2.paintComponent(JavaGame2.java:47)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintToOffscreen(Unknown Source)
at javax.swing.BufferStrategyPaintManager.paint(Unknown Source)
at javax.swing.RepaintManager.paint(Unknown Source)
at javax.swing.JComponent._paintImmediately(Unknown Source)
at javax.swing.JComponent.paintImmediately(Unknown Source)
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$1100(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)

2 个答案:

答案 0 :(得分:2)

paintComponent方法中,您需要初始化bullet Rectangle对象,以确保没有此类异常

答案 1 :(得分:0)

如果射击==假,我假设没有子弹?所以你会得到一个例外。当bullet应为null或不为null时,尝试在代码中放置断言。这可能会抓住它起源的错误。

一个简单的解决方法是更改​​此

if(bullet.intersects(rec));

if(bullet != null && bullet.intersects(rec));