I'm a newbie in Java and I'm trying to create a two player combat game in which the moves of the player are controlled by keyboard.As i didn't find any error in syntax or structure but it throws error.
My code is as follows:
my tester class :
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Tester extends JPanel implements KeyListener, Runnable,
MouseListener {
/**
 * 
 */
private static final long serialVersionUID = 1L;
/* Player class controls the actions of 1st player
 * Player2 class controls the actions of 2nd player
 * Health class controls increment or decrement in the health of the players */
Player p1;    
Player p1;
Player2 p2;
Health health;
Image img, end;
long startingTime, cumTime;
Image bg;
private boolean running;
public Tester() {
    running = true;
    p1 = new Player(500);
    p2 = new Player2();
    health = new Health(p1, p2);
}
public void loadImage() {
    try {
        img = ImageIO.read(new File(
                "D:/work/Mortal_combart/Falling@gettingUp/f05.gif"));
        end = ImageIO.read(new File("D:/work/Sprites/Dragon/end.png"));
        bg = ImageIO.read(new File("D:/work/Mortal_combart/Arena /pit.png"));
        p1.loadImage();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
@Override
protected void paintComponent(Graphics g) {
    // TODO Auto-generated method stub
    super.paintComponent(g);
    g.drawImage(bg, 0, 0, null);
    if (p1.exsists)
        p1.draw(g);
    else {
        g.drawImage(img, Math.round(p1.getX()), Math.round(p1.getY()), null);
        g.drawImage(end, 100, 300, null);
        g.setColor(Color.WHITE);
        g.drawRect(280, 470, 100, 40);
        g.drawString("TRY Again ?", 300, 500);
    }
    if (p2.exsists)
        p2.draw(g);
    else {
        g.drawImage(end, 100, 300, null);
        g.setColor(Color.WHITE);
        g.drawRect(280, 470, 100, 40);
        g.drawString("TRY Again ?", 300, 500);
    }
}
public static void main(String args[]) {
    Tester obj = new Tester();
    JFrame window = new JFrame();
    window.add(obj);
    window.setSize(800, 600);
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setVisible(true);
    Thread th = new Thread(obj);
    th.start();
}
public void run() {
    // TODO Auto-generated method stub
    loadImage();
    movieLoop();
}
public void movieLoop() {
    long startingTime = System.currentTimeMillis();
    cumTime = startingTime;
    while (running) {
        long timePassed = System.currentTimeMillis() - cumTime;
        cumTime += timePassed;
        p1.update(timePassed, getWidth(), getHeight());
        p2.update(timePassed, p1);
        repaint();
    }
}
@Override
public void keyPressed(KeyEvent arg0) {
    // TODO Auto-generated method stub
    int keyCode = arg0.getKeyCode();
    Game game = p1.getGame();
    if (keyCode == KeyEvent.VK_ESCAPE) {
        running = false;
    } else if (keyCode == KeyEvent.VK_1 && p1.exsists) {
        game.setCurrent(keyCode);
    } else if (keyCode == KeyEvent.VK_2 && p1.exsists) {
        game.setCurrent(keyCode);
    } else if (keyCode == KeyEvent.VK_3 && p1.exsists) {
        game.setCurrent(keyCode);
    } else {
        arg0.consume();
    }
}
@Override
public void keyReleased(KeyEvent e) {
    // TODO Auto-generated method stub
    if (p1.exsists)
        p1.getGame().setCurrent(KeyEvent.VK_0);
}
@Override
public void keyTyped(KeyEvent arg0) {
    // TODO Auto-generated method stub
    arg0.consume();
}
@Override
public void mouseClicked(MouseEvent e) {
    // TODO Auto-generated method stub
    if (e.getX() > 280 && e.getX() < 380 && e.getY() > 470
            && e.getY() < 510) {
        p1.restart();
        p2.restart();
        startingTime = System.currentTimeMillis();
        cumTime = startingTime;
    }
}
@Override
public void mouseEntered(MouseEvent arg0) {
    // TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent arg0) {
    // TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent arg0) {
    // TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent arg0) {
    // TODO Auto-generated method stub
}
}
My player class:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;
public class Player {
/*
 * Game class sets the the sprite to be drawn on screen based on key pressed
 * Sprites class controls the sprites of the game
 * Animation class handles adding or removing of one scene from the game
 */
private Game game;
private Sprites s;
private Animation animate;
private List<Sprites> sList;
public long health, defHealth;
public boolean exsists;
Image img, end, logo2;
public Player(long health) {
    this.health = health;
    this.defHealth = health;
    exsists = true;
}
public void loadImage() {
    try {
        logo2 = ImageIO.read(new File("D:/work/Sprites/Dragon/logo.png"));
        sList = new ArrayList<Sprites>();
        animate = new Animation(10, 1);
        animate.addScene(ImageIO.read(new File(
                "D:/work/Mortal_combart/punching1/01.gif")), 250);
        animate.addScene(ImageIO.read(new File(
                "D:/work/Mortal_combart/punching1/02.gif")), 250);
        animate.addScene(ImageIO.read(new File(
                "D:/work/Mortal_combart/punching1/03.gif")), 250);
        animate.addScene(ImageIO.read(new File(
                "D:/work/Mortal_combart/punching1/04.gif")), 250);
        animate.addScene(ImageIO.read(new File(
                "D:/work/Mortal_combart/punching1/05.gif")), 250);
        animate.addScene(ImageIO.read(new File(
                "D:/work/Mortal_combart/punching1/06.gif")), 250);
        s = new Sprites(animate, "sprites 2");
        s.setVelocityX(0);
        s.setVelocityY(0);
        sList.add(s);
        animate = new Animation(0, 3);
        animate.addScene(ImageIO.read(new File(
                "D:/work/Mortal_combart/FightingStance/a01.gif")), 100);
        animate.addScene(ImageIO.read(new File(
                "D:/work/Mortal_combart/FightingStance/a02.gif")), 100);
        animate.addScene(ImageIO.read(new File(
                "D:/work/Mortal_combart/FightingStance/a03.gif")), 100);
        animate.addScene(ImageIO.read(new File(
                "D:/work/Mortal_combart/FightingStance/a04.gif")), 100);
        animate.addScene(ImageIO.read(new File(
                "D:/work/Mortal_combart/FightingStance/a05.gif")), 100);
        animate.addScene(ImageIO.read(new File(
                "D:/work/Mortal_combart/FightingStance/a06.gif")), 100);
        s = new Sprites(animate, "sprites 1");
        s.setVelocityX(0);
        s.setVelocityY(0);
        sList.add(s);
        animate = new Animation(100, 80);
        animate.addScene(ImageIO.read(new File(
                "D:/work/Mortal_combart/Finishers/01.gif")), 250);
        animate.addScene(ImageIO.read(new File(
                "D:/work/Mortal_combart/Finishers/02.gif")), 250);
        animate.addScene(ImageIO.read(new File(
                "D:/work/Mortal_combart/Finishers/03.gif")), 250);
        animate.addScene(ImageIO.read(new File(
                "D:/work/Mortal_combart/Finishers/04.gif")), 250);
        animate.addScene(ImageIO.read(new File(
                "D:/work/Mortal_combart/Finishers/05.gif")), 250);
        animate.addScene(ImageIO.read(new File(
                "D:/work/Mortal_combart/Finishers/06.gif")), 250);
        animate.addScene(ImageIO.read(new File(
                "D:/work/Mortal_combart/Finishers/07.gif")), 250);
        animate.addScene(ImageIO.read(new File(
                "D:/work/Mortal_combart/Finishers/08.gif")), 250);
        s = new Sprites(animate, "sprites 2");
        s.setVelocityX(0);
        s.setVelocityY(0);
        sList.add(s);
        animate = new Animation(50, 50);
        animate.addScene(ImageIO.read(new File(
                "D:/work/Mortal_combart/jumping3/f01.gif")), 250);
        animate.addScene(ImageIO.read(new File(
                "D:/work/Mortal_combart/jumping3/f02.gif")), 250);
        animate.addScene(ImageIO.read(new File(
                "D:/work/Mortal_combart/jumping3/f03.gif")), 250);
        animate.addScene(ImageIO.read(new File(
                "D:/work/Mortal_combart/jumping3/f04.gif")), 250);
        animate.addScene(ImageIO.read(new File(
                "D:/work/Mortal_combart/jumping3/f05.gif")), 250);
        animate.addScene(ImageIO.read(new File(
                "D:/work/Mortal_combart/jumping3/f06.gif")), 250);
        animate.addScene(ImageIO.read(new File(
                "D:/work/Mortal_combart/jumping3/f07.gif")), 250);
        animate.addScene(ImageIO.read(new File(
                "D:/work/Mortal_combart/jumping3/f08.gif")), 250);
        s = new Sprites(animate, "sprites 2");
        s.setVelocityX(0.25f);
        s.setVelocityY(0);
        sList.add(s);
        game = new Game(sList);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
public void draw(Graphics g) {
    g.drawImage(logo2, 0, 0, null);
    g.setColor(Color.WHITE);
    g.drawString(health + " ", 100, 150);
    if (exsists)
        g.drawImage(game.getImage(), Math.round(game.getX()),
                Math.round(game.getY()), null);
}
public void update(long timePassed, int width, int height) {
    if (exsists)
        game.update(timePassed, width, height);
}
public Game getGame() {
    return game;
}
public float getX() {
    return game.getX();
}
public void setX(float x) {
    game.setX(x);
}
public float getY() {
    return game.getY();
}
public void setY(float y) {
    game.setX(y);
}
public long curAnimationDefence() {
    return game.curAnimationDefence();
}
public long curAnimationPower() {
    return game.curAnimationPower();
}
public void decHealth(long dec) {
    health -= Math.abs(dec);
}
public void restart() {
    exsists = true;
    health = defHealth;
    game.start();
    setX(0);
}
}
Error code thrown:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at gameon_check.Player.draw(Player.java:127)
at gameon_check.Tester.paintComponent(Tester.java:61)
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.RepaintManager$PaintManager.paintDoubleBuffered(Unknown Source)
at javax.swing.RepaintManager$PaintManager.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$4.run(Unknown Source)
at javax.swing.RepaintManager$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.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$1200(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$500(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$JavaSecurityAccessImpl.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)
After debugging the program for sometime I found out that if I change my if statement in draw method of player class to:
if (exsists && game!=null) it is not throwing any exception.As I have already set the value of game in my load image function of my player class I am not able to figure out why is it throwing such an exception.
My game class:
package gameon_check;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.util.List;
public class Game {
List<Sprites> aList;
Sprites cAnimate;
int prevCode;
public Game(List<Sprites> aList) {
    this.aList = aList;
    cAnimate = aList.get(1);
    prevCode = KeyEvent.VK_0;
}
public void update(long timePassed, int w, int h) {
    if (cAnimate.getX() < 0) {
        cAnimate.setX(w - cAnimate.getWidth());
    } else if (cAnimate.getX() + cAnimate.getWidth() >= w)
        cAnimate.setX(0);
    cAnimate.update(timePassed);
}
public void setCurrent(int keyCode) {
    float x = cAnimate.getX();
    if (keyCode == KeyEvent.VK_0) {
        cAnimate = aList.get(1);
        cAnimate.start();
        cAnimate.setX(x);
        prevCode = KeyEvent.VK_0;
    } else if (keyCode == KeyEvent.VK_1 && prevCode == KeyEvent.VK_0) {
        cAnimate = aList.get(0);
        cAnimate.start();
        cAnimate.setX(x);
        prevCode = KeyEvent.VK_1;
    } else if (keyCode == KeyEvent.VK_2 && prevCode == KeyEvent.VK_0) {
        cAnimate = aList.get(2);
        cAnimate.start();
        cAnimate.setX(x);
        prevCode = KeyEvent.VK_2;
    } else if (keyCode == KeyEvent.VK_3 && prevCode == KeyEvent.VK_0) {
        cAnimate = aList.get(3);
        cAnimate.start();
        cAnimate.setX(x);
        prevCode = KeyEvent.VK_3;
    }
}
public Image getImage() {
    return cAnimate.getImage();
}
public float getX() {
    return cAnimate.getX();
}
public float getY() {
    return cAnimate.getY();
}
public String info() {
    return cAnimate.info();
}
public void setX(float x)
{
    cAnimate.setX(x);
}
public void setY(float y)
{
    cAnimate.setY(y);
}
public long curAnimationDefence() {
    // TODO Auto-generated method stub
    return cAnimate.curAnimationDefence();
}
public long curAnimationPower() {
    // TODO Auto-generated method stub
    return cAnimate.curAnimationPower();
}
public void start()
{
    cAnimate = aList.get(1);
    prevCode = KeyEvent.VK_0;
    cAnimate.start();
}
}
