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

3

我有一个JFrame,并自动由Eclipse生成一个内容面板。

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

主方法创建新的框架:
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);
}

我希望你能理解我想做的事情。当我将字段添加到Game类的contentPane中时,我遇到了一个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
你能提供具体的错误信息吗?哪一行代码出现了空指针异常,是哪个对象为空呢?这有助于调试。 - Kumar Saurabh
1
框架是静态的,因此在您的程序中,执行顺序Game.frame.contentPane.add(this);被首先调用。将其变为非静态或在调用之前定义对象。 简而言之,在调用游戏类的构造函数之前,您的程序已终止。 - Kumar Saurabh
5
可能是什么是空指针异常,我该如何修复它?的重复。 - xlecoustillier
现在出现了一个错误消息。 - user5234518
Game.java:27行是什么? - Maslor
1
  1. 为了更快得到帮助,请发布一个[MCVE]。
  2. 参见什么是堆栈跟踪,如何使用它来调试我的应用程序错误?
  3. Java GUI必须在不同的操作系统、屏幕大小、屏幕分辨率等条件下工作,在不同的语言环境中使用不同的PLAF。因此,它们不适合像素完美的布局。相反,使用布局管理器或它们的组合,以及布局填充和边框来创建空白区域
- Andrew Thompson
2个回答

1
解决方案不是尝试从“Field”的构造函数中反向引用“Game”实例。这种逻辑本身就是不好的实践,因为它试图在“Game”构造函数的代码路径内访问静态字段之前设置它。您应该先创建“Field”实例,然后在已知其存在的代码点将其分配给“Game”。因此,请移动该行。
Game.frame.contentPane.add(this);

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

就像这样(在Game类中):contentPane.add(new Field(50, 50, 64, 64)); 我看不到这个标签在我的框架上。 - user5234518

0
根据您提供的信息,在不知道确切错误堆栈跟踪的情况下,我认为您的NullPointerException的来源在于:

contentPane.setLayout(null);

当您稍后调用Game实例时,具有null字段会引发异常。


这只是布局而已.. 我更喜欢使用坐标.. 你确定吗? - user5234518
虽然你提供的信息有些不完整,我不能确定,但是这种声明通常会导致 nullPointerExceptions。@Hackbaellchen - Maslor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接