Java JFrame 代码给出空指针异常

Java JFrame code giving Null Pointer Exception

所以我遇到的问题与我的 JFrame 有关。首先我要post我的代码在这里然后解释问题。

package evenMoreTesting;

import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.InputMap;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;

public class MyKeyBindings {

static int x1=0,x2=0,x3=0;
static JFrame frame;



public static void main(String[] args) {


    //JFrame frame = new JFrame();


    //some kind of problem when im calling JFrame out of the main class
    frame.setTitle("we still testing");
    frame.setSize(750, 500);
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);

    Action a1 = new AbstractAction() {
        public void actionPerformed(ActionEvent AE){

            x1 +=1;


            Action a2 = new AbstractAction() {
                public void actionPerformed(ActionEvent AE){

                    x2 +=1;


                    Action a3 = new AbstractAction() {
                        public void actionPerformed(ActionEvent AE){

                            x3 +=1;

                            if(x3==1){
                                System.out.println("you wot");
                            }
                            if(x3==2){
                                System.out.println("m8");
                            }


                        }
                    };

                    if(x2==1){
                        System.out.println("dude");
                    }
                    if(x2==2){
                        System.out.println("stop");
                    }
                    if(x1==3 && x2==4){
                        System.out.println("woah you broke the goddamn system");
                    }

                    //this game will be sensitive to how many clicks have happened

                    //and it doesnt work unless i call the above code in this action
                    //the a3 action will be in here just like a2 is in a1

                    JPanel content = (JPanel) frame.getContentPane();

                    KeyStroke three = KeyStroke.getKeyStroke("3");

                    InputMap IM = content.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);


                    IM.put(three, "x3++");
                    content.getActionMap().put("x3++", a3);



                }
            };






            JPanel content = (JPanel) frame.getContentPane();

            KeyStroke two = KeyStroke.getKeyStroke("2");

            InputMap IM = content.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);

            IM.put(two, "x2++");
            content.getActionMap().put("x2++",a2);


            if(x1==1){
                System.out.println("ok");
            }
            if(x1==2){
                System.out.println("cool");
            }



        }
    };



    JPanel content = (JPanel) frame.getContentPane();

    KeyStroke one = KeyStroke.getKeyStroke("1");


    InputMap IM = content.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
    IM.put(one, "x1++");
    content.getActionMap().put("x1++", a1);



}
}

所以问题是当我在 main 方法之外调用 JFrame 时出现此错误:

线程异常 "main" java.lang.NullPointerException 在 evenMoreTesting.MyKeyBindings.main(MyKeyBindings.java:27)

第 27 行是这样的:

frame.setTitle("we still testing");

其实前几天还没有这个问题,不知道怎么现在才开始异常

我决定将其注释掉,看看这是不是唯一的问题。我这样做了,但仍然有错误,但这次是在第 28 行,所以我注释掉了第 28 行,然后错误出现在第 29 行,其余带有框架的代码也发生了这种情况。

现在你可能会说,把 JFrame 放在 main 方法中就行了,但它需要在 main 方法之外是有原因的。

在我的操作中,我将调用 JFrame 将图像显示在屏幕上。当 JFrame 在主要方法中时,据我所知,它仅限于该方法。

所以我决定在主体外部调用 JFrame,这样操作也可以访问它。这就是我将图像调用到屏幕上的方式,供任何感兴趣的人使用或是否有助于解决此问题。

frame.add(new JLabel(new ImageIcon("frames/img01.jpg")));

Frames 是源文件夹,img01 是我在屏幕上的第一张图片

如果有其他方法可以将图像绘制到屏幕上,请告知。

简而言之,我的问题是,为什么在 main 方法外调用 JFrame 时会出现空指针异常,我该如何防止它。

提前致谢!

编辑:- 在这里,只需调用此方法 showImage("c:/image.png"); 并将路径传递给您的图像,它将创建一个 JFrame 并从该路径加载您的图像并将其显示给您:-

// the imports required
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.*;
import java.awt.*;

//paste this method in your class and call it when you want to display image

public void showImage(String path_to_image)
{
 JFrame frame = new JFrame("Image");
 frame.setLayout(new BorderLayout());
 frame.setResizable(false);
 ImageIcon myImage = new ImageIcon(path_to_image);
 frame.getContentPane().add(new JLabel(myImage)); 

 frame.pack();
 frame.setVisible(true);
}

在您的主添加 frame = new JFrame(); 中,因为您还没有创建它的新实例,因此您在将组件添加到框架的空值时收到空指针异常

如果您创建一个非原始 class 字段(参考)并且不对其进行初始化,那么默认情况下它将被初始化为 null

执行以下操作之一

  1. 取消注释以下行

    //JFrame frame = new JFrame();

    并删除以下行

    static JFrame frame;

  1. 更新下一行

    static JFrame frame;

    static JFrame frame = new JFrame();