I am trying to switch cards in a CardLayout from my game JPanel to my gameOver JPanel. Instead of switching screens, the game crashes. Thanks to any suggestions you may have in advance.
My Game code:
public class Game extends JPanel implements KeyListener {
    private Player player;
    private Stage stage;
    private Stage stageLeft;
    private Stage stageRight;
    private EnemyManager manager;
    private Window windowInstance;
    private boolean isGameOver = false;
    private boolean restart = false;
    public Game() {
        setSize(800,600);
        setPreferredSize(new Dimension(800,600));
        setFocusable(true);
        setBackground(Color.WHITE);
        requestFocus();
        addKeyListener(this);
        stage = new Stage(0, 540, 800, 100);
        stageLeft = new Stage(-1, 0, 1, 600);
        stageRight = new Stage(800, 0, 1, 600);
        player = new Player(this, 400, 400);
        manager = new EnemyManager(this, 10);
    }
    @Override
    public void update(Graphics g) {
        paint(g);
    }
    public void paint(Graphics g) {
        g.setColor(Color.WHITE);
        g.fillRect(0,0,getWidth(),getHeight());
        stage.draw(g);
        stageLeft.draw(g);
        stageRight.draw(g);
        if(!isGameOver || restart) {
            player.draw(g);
            manager.draw(g);
        } else {
            g.setColor(Color.BLACK);
            g.fillRect(0, 0, getWidth(), getHeight());
            g.setColor(Color.WHITE);
            g.setFont(new Font("Century Gothic", Font.BOLD, 24));
            g.drawString("Game Over!", 330, 300);
            //TODO: FIX CRASH ERROR
            if(!windowInstance.getGameOver()) {
                windowInstance.setGameOver(true);
            }
        }
        g.dispose();
        repaint();
    }
    @Override
    public void keyPressed(KeyEvent e) {
        int c = e.getKeyCode();
        if(c == KeyEvent.VK_W) {
        }
        if(c == KeyEvent.VK_A) {
            player.setxDir(-1);
        }
        if(c == KeyEvent.VK_S) {
        }
        if(c == KeyEvent.VK_D) {
            player.setxDir(1);
        }
    }
    public void setGameOver(boolean flag) {
        isGameOver = flag;
    }
    @Override
    public void keyReleased(KeyEvent e) {
        player.setxDir(0);
        player.setyDir(0);
    }
    @Override
    public void keyTyped(KeyEvent e) {
    }
    public Stage getStage() {
        return stage;
    }
    public Stage getStageLeft() { return stageLeft; }
    public Stage getStageRight() { return stageRight; }
    public EnemyManager getEnemyManager() {
        return manager;
    }
}
My Window code (Error seems to be caused by switching CardLayout to a gameOver JPanel):
public class Window {
    JFrame frame = new JFrame("Cube Fall");
    JPanel panelContainer = new JPanel();
    JPanel startMenu = new JPanel();
    Game game = new Game();
    JPanel gameOver = new JPanel();
    CardLayout cardLayout = new CardLayout();
    // Constructor
    public Window() {
        // Layout Stuff
        panelContainer.setLayout(cardLayout);
        panelContainer.add(startMenu, "0");
        panelContainer.add(game, "1");
        panelContainer.add(gameOver, "2");
        cardLayout.show(panelContainer, "0");
        // Setup startMenu
        JButton startButton = new JButton("Start");
        startMenu.add(startButton);
        startMenu.setBackground(Color.BLACK);
        startButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                cardLayout.show(panelContainer, "1");
                game.grabFocus();
            }
        });
        // Setup gameOver
        JButton restartButton = new JButton("Restart");
        gameOver.add(restartButton);
        gameOver.setBackground(Color.BLACK);
        restartButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                cardLayout.show(panelContainer, "1");
                game.grabFocus();
            }
        });
        frame.add(panelContainer);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
        frame.setResizable(false);
        frame.requestFocus();
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Window();
            }
        });
        /*
        Game game = new Game();
        JFrame frame = new JFrame();
        frame.setTitle("Java Game");
        frame.add(game);
        frame.pack();
        frame.setPreferredSize(new Dimension(800,600));
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // Center window
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);*/
    }
    public JFrame getFrame() {
        return frame;
    }
    private boolean trueOrFalse = false;
    public void setGameOver(boolean tof) {
        if(tof) {
            JButton restartButton = new JButton("Restart");
            restartButton.setLocation(300,300);
            game.add(restartButton);
            restartButton.setVisible(true);
            game.revalidate();
            //cardLayout.show(panelContainer, "2");
            trueOrFalse = true;
        }
    }
    public boolean getGameOver() {
        return trueOrFalse;
    }
}
The error I get is below:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at Game.paint(Game.java:59)
    at javax.swing.JComponent._paintImmediately(JComponent.java:5106)
    at javax.swing.JComponent.paintImmediately(JComponent.java:4890)
    at javax.swing.RepaintManager$3.run(RepaintManager.java:814)
    at javax.swing.RepaintManager$3.run(RepaintManager.java:802)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:86)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:802)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:745)
    at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:725)
    at javax.swing.RepaintManager.access$1000(RepaintManager.java:46)
    at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1680)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:715)
    at java.awt.EventQueue.access$400(EventQueue.java:82)
    at java.awt.EventQueue$2.run(EventQueue.java:676)
    at java.awt.EventQueue$2.run(EventQueue.java:674)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:86)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:685)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
 
    