为什么我的代码会抛出NullPointerException?

时间:2015-08-31 12:37:23

标签: java swing nullpointerexception

我有一个JFrame并自动生成Eclipse生成的内容窗格。

public JPanel contentPane = new JPanel();
public static Game frame;

main方法创建新框架:

frame = new Game();
frame.setVisible(true);

创建新实例:

public Game() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    contentPane.setLayout(null);
    contentPane.setSize(500, 500);
    setContentPane(contentPane);

在这结束时,我想创建一个我的Field.java的新对象(扩展JLabel

new Field(50, 50, 64, 64);

Field.java:

public Field(int x, int y, int x2, int y2) {
    setBounds(x, y, x2, y2);
    Game.frame.contentPane.add(this);
}

我希望你能理解我正在做的事情。将字段添加到contentPane类的Game时,我会得到NullPointerException。我认为,contentPanenull。但为什么?我该怎么做才能避免这种情况?

错误讯息:

java.lang.NullPointerException
at Hackbaellchen.Field.<init>(Field.java:23)
at Hackbaellchen.Lemmings.<init>(Game.java:73)
at Hackbaellchen.Lemmings$1.run(Game.java:27)

Field.java:23是Game.frame.contentPane.add(this); Game.java:73是new Field(50, 50, 64, 64);

2 个答案:

答案 0 :(得分:1)

解决方案不是试图从Game的构造函数反向引用Field实例。这种逻辑无论如何都是不好的做法,在这里它尝试在设置之前访问静态字段(从Game构造函数的代码路径中)。

您应首先创建Field实例,然后从已知存在的代码中的某个点将其分配给Game。所以移动线

Game.frame.contentPane.add(this);

到这样的地方(并将this替换为Field变量的名称)。

答案 1 :(得分:0)

根据您提供的信息,我们不知道确切的错误堆栈跟踪,我认为您的NullPointerException的来源是:

contentPane.setLayout(null);

稍后您调用Game实例时,使用该null字段会抛出异常。