I was doing a tutorial online because I wanted to make a 2d side scroller, and I got this exact error. I have googled it but came up with nothing. I tried looking for a typo and it looks clean, its not giving me an error anywere else in the code. I do not know where to start. If you could explaing to me what the error is and how i fix it then that would be amazing.
    package Main;
import GameState.GameStateManager;
import javax.swing.JPanel;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
public class GamePanel extends JPanel implements Runnable, KeyListener{
    public static final int WIDTH = 320;
    public static final int HIGHT = 240;
    public static final int SCALE = 2;
    //game thread
    private Thread thread;
    private boolean running;
    private int FPS = 60;
    private long targetTime = 1000/FPS;
    //image        
    private BufferedImage image;
    private Graphics2D g;
    //game state manager
    private GameStateManager gsm;
    public GamePanel(){
        super();
        setPreferredSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
        setFocusable(true);
        requestFocus();
    }
    public void addNotify(){
        super.addNotify();
        if (thread == null) {
            thread = new Thread(this);
            addKeyListener(this);
            thread.start();
        }
    }   
    private void init() {
        image = new BufferedImage(WIDTH, HIGHT, BufferedImage.TYPE_INT_RGB);     
        g = (Graphics2D) image.getGraphics();
        running = true;
        gsm = new GameStateManager();
    }
        public void run(){
        init();
        long start, elapsed, wait;
        //game loop
          while(running) {
            start = System.nanoTime();
            update();
            draw();
            drawToScreen();
               elapsed = System.nanoTime() - start;
               wait = targetTime - elapsed / 1000000;
               try
               {
                   Thread.sleep(wait);
               }
               catch(Exception e) 
               {
                   e.printStackTrace();
               }//end of try catch
          }
        }
        private void update()
        {
            gsm.update();
        }
        private void draw()
        {
            gsm.draw(g);
        }
        private void drawToScreen()
        {
            Graphics g2 = getGraphics();
            g2.drawImage(image, 0, 0, null);
            g2.dispose();
        }
        public void KeyPressed(KeyEvent key) 
        {
         gsm.keyPressed(key.getKeyCode());
        }
        public void KeyReleased(KeyEvent key) 
        {
         gsm.keyReleased(key.getKeyCode());
        }
    }