我在完成这项任务时遇到了麻烦。我有2个班级:
public class MainJFrame extends JFrame implements ActionListener {
public Labels labels;
public MainJFrame() {
setSize(1024, 960);
setTitle("er");
setLayout(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
labels = new Labels();
labels.addLabels();
}
public static MainJFrame application;
public static void main(String[] args) {
application = new MainJFrame();
application.setVisible(true);
}
}
和第二课:
public class Labels {
public JLabel l_acceleration;
public void addLabels() {
MainJFrame.application.add(MainJFrame.application.labels.l_acceleration);
}
public Labels() {
l_acceleration = new JLabel("acc");
l_acceleration.setBounds(90, 90, 90, 20);
}
我收到了这个错误:
Exception in thread "main" java.lang.NullPointerException
at gui.Labels.addLabels(Labels.java:12)
at cardmaker.MainJFrame.<init>(MainJFrame.java:16)
at cardmaker.MainJFrame.main(MainJFrame.java:22)
那里有什么问题?我无法在网络上的任何地方找到解决方案。我认为这个问题就在附近: MainJFrame.application.add(MainJFrame.application.labels.l_acceleration); 为什么我不能在构造函数中使用此函数? 有没有办法可以做到这一点?我真的需要它。
答案 0 :(得分:1)
在MainJFrame
课程中,您声明了一个名为application
的字段。
public static MainJFrame application;
由于这是一个静态字段,因此当您的应用程序到达main方法时,此字段已自动使用默认值null
进行初始化。然后在你的主要课程中你给出这个指示:
application = new MainJFrame();
在application
分配给新值之前,MainJFrame的构造函数必须运行完成。构造函数启动并最终创建一个新的Labels
对象并在其中调用addLabels
。
问题是,addLabels
方法调用MainJFrame.application.add
。请注意,它指的是MainJFrame.application
,但由于构造函数尚未完成,MainJFrame.application
的值尚未从默认值{{1}更改所以你得到一个NullPointerException。
解决这个问题的一种方法是将对MainJFrame的引用直接传递给Labels并以这种方式引用它:
null
...并在构造函数中调用public void addLabels(MainJFrame f) {
f.add(f.labels.l_acceleration);
}
,如下所示:
addLabels
请注意,这仍然不是很好的代码,但这是另一天的更高级主题。 :)
答案 1 :(得分:0)
public static void main(String[] args) {
application = new MainJFrame();
Labels j = new Labels();
j.addLabels();
application.setVisible(true);
}
您可以使用此代码解决问题。
而不是在MainJFrame()中调用addLabels(),而不是在main()中调用它。