我有一个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
。我认为,contentPane
是null
。但为什么?我该怎么做才能避免这种情况?
错误讯息:
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);
答案 0 :(得分:1)
解决方案不是试图从Game
的构造函数反向引用Field
实例。这种逻辑无论如何都是不好的做法,在这里它尝试在设置之前访问静态字段(从Game
构造函数的代码路径中)。
您应首先创建Field
实例,然后从已知存在的代码中的某个点将其分配给Game
。所以移动线
Game.frame.contentPane.add(this);
到这样的地方(并将this
替换为Field
变量的名称)。
答案 1 :(得分:0)
根据您提供的信息,我们不知道确切的错误堆栈跟踪,我认为您的NullPointerException的来源是:
contentPane.setLayout(null);
稍后您调用Game实例时,使用该null字段会抛出异常。