0

我创建了一个 Java 应用程序并得到了这个异常:

Exception in thread "main" java.lang.NullPointerException
    at java.awt.Container.addImpl(Unknown Source)
    at java.awt.Container.add(Unknown Source)
    at javax.swing.JFrame.addImpl(Unknown Source)
    at java.awt.Container.add(Unknown Source)
    at Executer.<init>(Executer.java:21)
    at Executer.main(Executer.java:14 

这是代码:

import javax.swing.*;
import java.awt.*;

public class Executer {

private JLabel lblCommand;
private JTextField txtEnter;
private JButton btNext, btPrevious;
private JPanel panel;

public static void main(String[] args) {
    new Executer();
}
public Executer() {
    JFrame frame = new JFrame("Execute Script");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(900,400);
    frame.setVisible(true);
    frame.add(panel); 
    frame.setVisible(true);
    MyPanel();
    Text();
    Buttons();
    Fields();
}
public void MyPanel() {
    panel = new JPanel();
    panel.setLayout(null);
}
public void Text(){
    lblCommand = new JLabel("Enter Here");
    lblCommand.setBounds(135, 50, 150, 20);
    Font styleOne = new Font("Arial", Font.BOLD, 13);
    lblCommand.setFont(styleOne);
    panel.add(lblCommand);
}

public void Fields () {
    txtEnter = new JTextField();
    txtEnter.setBounds(210, 50, 150, 20);
    panel.add(txtEnter);
}
public void Buttons() {
    btNext = new JButton ("Next");
    btNext.setBounds(380,325,100,20);
    panel.add(btNext);

    btPrevious = new JButton ("Previous");
    btPrevious.setBounds(260,325,100,20);
    panel.add(btPrevious);
}}

什么是 NullPointerException?我怎么知道?

4

4 回答 4

6

您需要panel在添加之前进行实例化。如果您在调用之前使用面板MyPanel()panel仍然是null,因此NullPointerException.

当你在这里的时候,看看这个。http://geosoft.no/development/javastyle.html

Java 中的方法名称应混合大小写,以小写字母开头,例如,myPanel()而不是MyPanel(). 对我们大多数人来说,MyPanel()乍一看就像一个构造函数,因为你的样式不正确。

此外,MyPanelTextFieldsButtons都应该是私有方法,因为外部类调用它们是不合适的。

于 2013-07-28T22:37:59.840 回答
1

正如其他人所说,您需要先创建 JPanel,然后再尝试将其添加到 JFrame。事实上,您通常也应该在 JPanel 内创建所有组件。我建议你把电话转移到

Text();
Buttons();
Fields();

Executer构造函数到MyPanel()方法并在调用MyPanel()之前调用frame.add(panel);

此外,您不需要调用frame.setVisible(true);两次。此外,您应该使用 aLayoutManager而不是调用panel.setLayout(null);. 请参阅使用布局管理器的 Oracle 教程。

于 2013-07-28T22:50:19.507 回答
1

此行中的问题frame.add(panel);Panel 在该点未初始化,请MyPanel();在添加之前移动此行以对其进行初始化。

于 2013-07-28T22:39:00.020 回答
0

是的,您在创建 JPanel 对象之前将面板添加到框架中。无论如何,用这个改变你的构造函数:

public Executer() {
        JFrame frame = new JFrame("Execute Script");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(900, 400);

        MyPanel();
        Text();
        Buttons();
        Fields();

        frame.add(panel);
        frame.setVisible(true);

    }

谢谢。

于 2013-12-12T10:35:06.990 回答