-2

I am getting a NullPointer Exception at the following line...

p1.setColor(Color.green);

Code:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.color.ColorSpace;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main extends JPanel implements KeyListener {


    public int FRAME_WIDTH = 800, FRAME_HEIGHT = 650;
    public Image screen;

    //Player 1
    public int x = 100;
    public int y = 100;
    public int px = 117;
    public int py = 115;
    public boolean up, down, right, left;
    public Graphics p1;

    //Player 2
    public int x2 = 600;
    public int y2 = 100;
    public int px2 = 617;
    public int py2 = 115;
    public boolean up2, down2, right2, left2;
    public  Graphics p2;

    public static void main(String[] args) {
        JFrame frame = new JFrame("Game");
        Main main = new Main();
        frame.add(main);
        frame.setSize(main.FRAME_WIDTH, main.FRAME_HEIGHT);
        frame.setBackground(Color.BLACK);
        frame.setVisible(true);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        main.screen = frame.createImage(main.FRAME_WIDTH, main.FRAME_HEIGHT);
        main.p1 = main.screen.getGraphics();
        main.p2 = main.screen.getGraphics();

        while(true) {
            //Player 1
            if(main.up = true) {
                main.y+=2;
            }
            if(main.down = true) {
                main.y-=2;
            }
            if(main.right = true) {
                main.x+=2;
            }
            if(main.left = true) {
                main.x-=2;
            }

            //Player 2
            if(main.up2 = true) {
                main.y2+=2;
            }
            if(main.down2 = true) {
                main.y2-=2;
            }
            if(main.right2 = true) {
                main.x2+=2;
            }
            if(main.left2 = true) {
                main.x2-=2;
            }

            frame.repaint();
            try {
                Thread.sleep(20);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }

    @Override
    public void paintComponent(Graphics g) {
        String player1 = "Player 1";
        String player2 = "Player 2";
        p1.setColor(Color.green);
        p2.setColor(Color.green);
        p1.drawString(player1, x, y);
        p2.drawString(player2, x2, y2);
        p1.setColor(Color.red);
        p2.setColor(Color.red);
        p1.fillOval(px, py, 5, 5);
        p2.fillOval(px2, py2, 5, 5);
        g.drawImage(screen, 0, 0, this);
    }

    @Override
    public void keyPressed(KeyEvent e) {

        //Player 1
        if(e.getKeyCode() == KeyEvent.VK_W) {
            up = true;
        }
        if(e.getKeyCode() == KeyEvent.VK_S) {
            down = true;
        }
        if(e.getKeyCode() == KeyEvent.VK_D) {
            right = true;
        }
        if(e.getKeyCode() == KeyEvent.VK_A) {
            left = true;
        }


        //Player 2
        if(e.getKeyCode() == KeyEvent.VK_UP) {
            up2 = true;
        }
        if(e.getKeyCode() == KeyEvent.VK_DOWN) {
            down2 = true;
        }
        if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
            right2 = true;
        }
        if(e.getKeyCode() == KeyEvent.VK_LEFT) {
            left2 = true;
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {

        //Player 1 - Release
        if(e.getKeyCode() == KeyEvent.VK_W) {
            up = false;
        }
        if(e.getKeyCode() == KeyEvent.VK_S) {
            down = false;
        }
        if(e.getKeyCode() == KeyEvent.VK_D) {
            right = false;
        }
        if(e.getKeyCode() == KeyEvent.VK_A) {
            left = false;
        }

        //Player 2 - Release
        if(e.getKeyCode() == KeyEvent.VK_UP) {
            up2 = false;
        }
        if(e.getKeyCode() == KeyEvent.VK_DOWN) {
            down2 = false;
        }
        if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
            right2 = false;
        }
        if(e.getKeyCode() == KeyEvent.VK_LEFT) {
            left2 = false;
        }


    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

}
Tunaki
  • 132,869
  • 46
  • 340
  • 423
Dondaj
  • 35
  • 10
  • @azurefrog I assume he intends `main.p1 = main.screen.getGraphics();` to give `p1` a value. I don't think the duplicate flag is appropriate here - this question is specifically about why the method he has tried to use to assign a value to `p1` isn't working to assign it a value. – nhouser9 Jul 06 '16 at 22:31
  • 1
    Your screen object is never assigned a value. It is null. I am guessing paintcomponent is actually being called long before you try to create a graphics object from main.screen (since you set the frame visible) so you get NPE at that point. – arynaq Jul 06 '16 at 22:33
  • it works for me, without any exception! – Rahmat Waisi Jul 06 '16 at 22:38
  • Thanks! Now Works! But my KeyEvent is not working.. – Dondaj Jul 06 '16 at 22:49

1 Answers1

2

Like arynaq said, the Graphics object is never given a value, so you need to initialize that, but for your key listener issue, to resolve this you need to add a key listener to the frame

frame.addKeyListener(this);
J4S
  • 54
  • 5