스레드 AWT-EventQueue-0 java.lang.NullPointerException의 예외

Sheeraz Gul 2023년10월12일
스레드 AWT-EventQueue-0 java.lang.NullPointerException의 예외

"AWT-EventQueue-0" java.lang.NullPointerException 예외는 Java AWT 패키지 메서드로 작업할 때 발생하며 null 값이 모든 메서드에 전달됩니다. 이 튜토리얼은 Java에서 이 NullPointerException을 해결하는 방법을 보여줍니다.

Java에서 스레드 “AWT-EventQueue-0” java.lang.NullPointerException의 예외

"AWT-EventQueue-0" java.lang.NullPointerException은 AWT 패키지에 null 값을 전달할 때 발생합니다. NullPointerException 예외는 Java에서 가장 일반적입니다.

다음 조건 중 하나라도 충족되면 NullPointerException이 발생합니다.

  1. null 개체 필드에 액세스하고 수정할 때.
  2. null 개체에서 메서드를 호출할 때.
  3. null 개체의 슬롯에 액세스하고 수정할 때.
  4. null 배열의 길이를 취하는 경우.
  5. null 개체를 통해 동기화를 시도할 때.
  6. null 값을 던질 때.

Java에서 "AWT-EventQueue-0" java.lang.NullPointerException을 발생시키는 예제를 시도해 봅시다.

package delftstack;

import java.awt.*;
import java.awt.event.*;
import java.util.Timer;
import javax.swing.*;

@SuppressWarnings("serial")

public class Example extends JFrame implements ActionListener, KeyListener {
  static Dimension Screen_Size = new Dimension(Toolkit.getDefaultToolkit().getScreenSize());
  Insets Scan_Max = Toolkit.getDefaultToolkit().getScreenInsets(getGraphicsConfiguration());
  int Task_Bar_Size = Scan_Max.bottom;
  static JFrame Start_Screen = new JFrame("Start Screen");
  static JFrame Game_Frame = new JFrame("Begin the Game!");
  static JLabel Cow_Label = new JLabel();
  static int Sky_Int = 1;
  static JLabel Sky_Label = new JLabel();
  static int SECONDS = 1;
  static boolean IS_Pressed = false;
  public static void main(String[] args) {
    new Example();
  }
  public Example() {
    JPanel Buttons_Panel = new JPanel();
    Buttons_Panel.setLayout(null);
    Start_Screen.setSize(new Dimension(
        Screen_Size.width - getWidth(), Screen_Size.height - Task_Bar_Size - getHeight()));
    Start_Screen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Start_Screen.setVisible(true);
    System.out.println(Start_Screen.getSize());

    // buttons

    JButton Start_Button = new JButton("Start");
    Start_Button.addActionListener(this);
    Start_Button.setSize(
        (int) Start_Screen.getWidth() / 7, (int) (Start_Screen.getHeight() / 15.36));
    Start_Button.setBounds((Start_Screen.getWidth() / 2) - Start_Button.getWidth() / 2,
        ((int) Start_Screen.getHeight() / 2) - Start_Button.getHeight(), Start_Button.getWidth(),
        Start_Button.getHeight());
    Start_Button.setActionCommand("Start");

    Buttons_Panel.add(Start_Button);
    Start_Screen.add(Buttons_Panel);
  }
  @Override
  public void actionPerformed(ActionEvent Action_Event) {
    Object CMD_Object = Action_Event.getActionCommand();
    if (CMD_Object == "Start") {
      Start_Screen.setVisible(false);
      //  getClass().getResource("/cow.png") and getClass().getResource("/grass.png") is giving null
      // because there is no image in folder named cow.png or grass.png
      ImageIcon Cow_Image = new ImageIcon(getClass().getResource("/cow.png"));
      ImageIcon Grass_Image = new ImageIcon(getClass().getResource("/grass.png"));

      Game_Frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      Game_Frame.setSize(Start_Screen.getSize());
      Game_Frame.setVisible(true);
      JPanel Demo_Panel = new JPanel();
      Demo_Panel.setBackground(Color.white);
      Demo_Panel.setLayout(null);
      Demo_Panel.setFocusable(true);
      Game_Frame.add(Demo_Panel);
      Demo_Panel.addKeyListener(this);
      Cow_Label.setBounds(
          (Start_Screen.getWidth() / 2) - 105, (Start_Screen.getHeight() / 2) - 55, 210, 111);
      Cow_Label.setIcon(Cow_Image);
      Demo_Panel.add(Cow_Label);
      Demo_Panel.setVisible(true);
      Cow_Label.setVisible(true);
      JLabel Grass_Label = new JLabel();
      System.out.println("grass");
      //  getClass().getResource("/Sky.png") will throw a nullpointerexception because there is no
      //  image in the folder
      ImageIcon Sky1 = new ImageIcon(getClass().getResource("/Sky.png"));
      Sky_Label.setIcon(Sky1);
      Grass_Label.setIcon(Grass_Image);
      Grass_Label.setBounds(0, (Start_Screen.getHeight() - 308), Start_Screen.getWidth(), 350);
      System.out.println("mOooow");
      Demo_Panel.add(Grass_Label);
      Sky_Label.setBounds(1, 56, 1366, 364);
      Demo_Panel.add(Sky_Label);
      System.out.println("google");
    }
  }
  @Override
  public void keyPressed(KeyEvent Key_Event) {
    int CMD_Int = Key_Event.getKeyCode();
    //  getClass().getResource("/cow moving.gif") will throw a nullpointerexception because there is
    //  no image in the folder
    ImageIcon Moving_Cow = new ImageIcon(getClass().getResource("/cow moving.gif"));
    System.out.println(CMD_Int);
    IS_Pressed = true;
    if (CMD_Int == 39) {
      System.out.println("Key is Pressed");
      Cow_Label.setIcon(Moving_Cow);
    } else if (CMD_Int == 37) {
    }
    System.out.println("End");
    while (IS_Pressed == true) {
      Timer Wait_Please = new Timer("Wait Please");
      try {
        Wait_Please.wait(1000);
      } catch (InterruptedException p) {
      }
      int SKY = 1;
      SKY += 1;
      String SKY_String = "/Sky" + String.valueOf(SKY) + ".png";
      ImageIcon SKy = new ImageIcon(getClass().getResource(SKY_String));
      Sky_Label.setIcon(SKy);
      if (IS_Pressed == false) {
        Wait_Please.cancel();
        break;
      }
    }
  }

  @Override
  public void keyReleased(KeyEvent Key_Event) {
    //  getClass().getResource("/cow.png") and getClass().getResource("/grass.png") is giving null
    // because there is no image in folder named cow.png or grass.png
    ImageIcon Cow_Image = new ImageIcon(getClass().getResource("/cow.png"));
    int CMD_Int = Key_Event.getKeyCode();
    IS_Pressed = false;
    if (CMD_Int == 39) {
      Cow_Label.setIcon(Cow_Image);
    } else if (CMD_Int == 37) {
      Cow_Label.setIcon(Cow_Image);
    }
  }
  @Override
  public void keyTyped(KeyEvent c) {
    // TODO Auto-generated method stub
  }
}

위의 코드는 소가 서있는 간단한 게임에 관한 것이며 소는 버튼을 누르면 움직이기 시작합니다. AWT 메서드 new ImageIcon(getClass().getResource())null 항목을 가져오기 때문에 "AWT-EventQueue-0" java.lang.NullPointerException이 발생합니다.

이 코드의 출력은 다음과 같습니다.

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException: Cannot invoke "java.net.URL.toExternalForm()" because "location" is null
    at java.desktop/javax.swing.ImageIcon.<init>(ImageIcon.java:234)
    at delftstack.Example.actionPerformed(Example.java:48)
    at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1972)
    at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2313)
...

이미지를 클래스 폴더 경로로 이동하여 이 문제를 해결할 수 있습니다. Windows에서 Java의 경로로 \\를 사용하므로 /를 제거할 수도 있습니다.

여전히 작동하지 않는 경우 이미지의 전체 경로를 제공할 수 있습니다. 추가 설명은 위의 코드에서 주석 처리됩니다.

작가: Sheeraz Gul
Sheeraz Gul avatar Sheeraz Gul avatar

Sheeraz is a Doctorate fellow in Computer Science at Northwestern Polytechnical University, Xian, China. He has 7 years of Software Development experience in AI, Web, Database, and Desktop technologies. He writes tutorials in Java, PHP, Python, GoLang, R, etc., to help beginners learn the field of Computer Science.

LinkedIn Facebook

관련 문장 - Java Exception