Java 带有getText()的NullPointerException

Java 带有getText()的NullPointerException,java,swing,nullpointerexception,jtextfield,Java,Swing,Nullpointerexception,Jtextfield,我试图从文本字段中获取文本,但每次运行程序时,都会得到一个NullPointerException。我在互联网上发现的类似问题涉及将文本字段重新声明为局部变量,但我看不出我正在这样做 错误是: Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 在指定的行。任何帮助都将不胜感激 编辑: 这个简短的程序演示了这个问题 import java.awt.BorderLayout; import java.awt.

我试图从文本字段中获取文本,但每次运行程序时,都会得到一个NullPointerException。我在互联网上发现的类似问题涉及将文本字段重新声明为局部变量,但我看不出我正在这样做

错误是:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
在指定的行。任何帮助都将不胜感激

编辑:

这个简短的程序演示了这个问题

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class Test{

public static final Test application = new Test();
private JFrame jFrame = null;
private JPanel jContentPane = null, buttonsPanel = null, cardPanel = null, manualPanel = null, uploadPanel = null,
        defaultPanel = null;
private JPanel[] mainPanel = {getDefaultPanel(), getManualPanel(), getUploadPanel()};
private JButton manualButton = null, uploadButton = null, manualAssignButton = null;
private JTextField manualEntryField = null;
private JLabel manualLabel = null;

final static String DEFAULTPANEL = "Default";
final static String MANUALPANEL = "Manual";
final static String UPLOADPANEL = "Upload";

/**
 * Main method
 * @param args
 */
public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            application.getJFrame().setVisible(true);
        }
    });
}

/**
 * Get the main application frame
 * @return JFrame
 */
private JFrame getJFrame() {
    if (jFrame == null) {
        jFrame = new JFrame();
        jFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        jFrame.setResizable(false);
        // Add the main content pane
        jFrame.setContentPane(getJContentPanel());
        jFrame.addWindowListener(new java.awt.event.WindowAdapter() {   
            public void windowClosing(java.awt.event.WindowEvent e) {    
                closeApplication();
            }
        });
    }
    jFrame.pack();
    jFrame.setLocationRelativeTo(null);
    return jFrame;
}

/**
 * Get main content
 * @return JPanel
 */
private JPanel getJContentPanel(){
    if (jContentPane == null) {
        jContentPane = new JPanel();
        jContentPane.setPreferredSize(new Dimension(500, 200));
        jContentPane.setLayout(new BorderLayout());
        jContentPane.add(getButtonsPanel(), BorderLayout.NORTH);
        jContentPane.add(getCardPanel(), BorderLayout.CENTER);
    }
    return jContentPane;
}

private JPanel getButtonsPanel() {
    if(buttonsPanel == null){
        buttonsPanel = new JPanel();
        buttonsPanel.setPreferredSize(new Dimension(500, 50));
        buttonsPanel.setBorder(BorderFactory.createLineBorder(Color.gray));

        manualButton = new JButton("Enter manually");
        manualButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                CardLayout cl = (CardLayout)(cardPanel.getLayout());
                cl.show(cardPanel, MANUALPANEL);
            }
        });

        uploadButton = new JButton("Upload file");
        uploadButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                CardLayout cl = (CardLayout)(cardPanel.getLayout());
                cl.show(cardPanel, UPLOADPANEL);
            }
        });

        buttonsPanel.add(manualButton);
        buttonsPanel.add(uploadButton);
    }
    return buttonsPanel;
}

private JPanel getCardPanel() {
    if(cardPanel == null){
        cardPanel = new JPanel(new CardLayout());
        cardPanel.setPreferredSize(new Dimension(500, 200));
        cardPanel.setBorder(BorderFactory.createLineBorder(Color.gray));
        cardPanel.add(mainPanel[0], DEFAULTPANEL);
        cardPanel.add(mainPanel[1], MANUALPANEL);
        cardPanel.add(mainPanel[2], UPLOADPANEL);
    }
    return cardPanel;
}

private JPanel getDefaultPanel() {
    if(defaultPanel == null){
        defaultPanel = new JPanel();
    }
    return defaultPanel;
}

private JPanel getManualPanel() {
    if(manualPanel == null){
        manualPanel = new JPanel();
        manualPanel.setLayout(new FlowLayout());

        manualEntryField = new JTextField(10);
        manualEntryField.setText("Enter code");

        manualAssignButton = new JButton("Assign");
        manualAssignButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
             // Here is the exception
            System.out.println(manualEntryField.getText().trim());
            }
        });

        manualLabel = new JLabel("Please enter a code and press assign");

        manualPanel.add(manualEntryField);
        manualPanel.add(manualAssignButton);
        manualPanel.add(manualLabel);

    }
    return manualPanel;
}

private JPanel getUploadPanel() {
    if(uploadPanel == null){
        uploadPanel = new JPanel();
    }
    return uploadPanel;
}

private void closeApplication() {
    System.exit(0);
}
}

如果textBox为空,则此异常是正常的。试试这个
如果(getText().size()文本框为空时是否单击该按钮?如果是,则在调用trim()函数时可能会出现该异常,因此在调用trim()之前,请查看getText()返回的内容

在查看了您的SSCCE之后,我通过注释掉实例化的冗余
测试
,并在构造函数中创建面板数组,成功地解决了NPE问题

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class Test{

//public static final Test application = new Test();
private JFrame jFrame = null;
private JPanel jContentPane = null, buttonsPanel = null, cardPanel = null, manualPanel = null, uploadPanel = null,
        defaultPanel = null;
private JPanel[] mainPanel = new JPanel[3];
private JButton manualButton = null, uploadButton = null, manualAssignButton = null;
private JTextField manualEntryField = null;
private JLabel manualLabel = null;

final static String DEFAULTPANEL = "Default";
final static String MANUALPANEL = "Manual";
final static String UPLOADPANEL = "Upload";

Test() {
    mainPanel[0] = getDefaultPanel();
    mainPanel[1] = getManualPanel();
    mainPanel[2] = getUploadPanel();
}

/**
 * Main method
 * @param args
 */
public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            new Test().getJFrame().setVisible(true);
        }
    });
}

/**
 * Get the main application frame
 * @return JFrame
 */
private JFrame getJFrame() {
    if (jFrame == null) {
        jFrame = new JFrame();
        jFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        jFrame.setResizable(false);
        // Add the main content pane
        jFrame.setContentPane(getJContentPanel());
        jFrame.addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent e) {
                closeApplication();
            }
        });
    }
    jFrame.pack();
    jFrame.setLocationRelativeTo(null);
    return jFrame;
}

/**
 * Get main content
 * @return JPanel
 */
private JPanel getJContentPanel(){
    if (jContentPane == null) {
        jContentPane = new JPanel();
        jContentPane.setPreferredSize(new Dimension(500, 200));
        jContentPane.setLayout(new BorderLayout());
        jContentPane.add(getButtonsPanel(), BorderLayout.NORTH);
        jContentPane.add(getCardPanel(), BorderLayout.CENTER);
    }
    return jContentPane;
}

private JPanel getButtonsPanel() {
    if(buttonsPanel == null){
        buttonsPanel = new JPanel();
        buttonsPanel.setPreferredSize(new Dimension(500, 50));
        buttonsPanel.setBorder(BorderFactory.createLineBorder(Color.gray));

        manualButton = new JButton("Enter manually");
        manualButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                CardLayout cl = (CardLayout)(cardPanel.getLayout());
                cl.show(cardPanel, MANUALPANEL);
            }
        });

        uploadButton = new JButton("Upload file");
        uploadButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                CardLayout cl = (CardLayout)(cardPanel.getLayout());
                cl.show(cardPanel, UPLOADPANEL);
            }
        });

        buttonsPanel.add(manualButton);
        buttonsPanel.add(uploadButton);
    }
    return buttonsPanel;
}

private JPanel getCardPanel() {
    if(cardPanel == null){
        cardPanel = new JPanel(new CardLayout());
        cardPanel.setPreferredSize(new Dimension(500, 200));
        cardPanel.setBorder(BorderFactory.createLineBorder(Color.gray));
        cardPanel.add(mainPanel[0], DEFAULTPANEL);
        cardPanel.add(mainPanel[1], MANUALPANEL);
        cardPanel.add(mainPanel[2], UPLOADPANEL);
    }
    return cardPanel;
}

private JPanel getDefaultPanel() {
    if(defaultPanel == null){
        defaultPanel = new JPanel();
    }
    return defaultPanel;
}

private JPanel getManualPanel() {
    if(manualPanel == null){
        manualPanel = new JPanel();
        manualPanel.setLayout(new FlowLayout());

        manualEntryField = new JTextField(10);
        System.out.println("creating text field");
        manualEntryField.setText("Enter code");

        manualAssignButton = new JButton("Assign");
        manualAssignButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
             // Here is the exception
            System.out.println(manualEntryField);
            System.out.println(manualEntryField.getText());
            System.out.println(manualEntryField.getText().trim());
            }
        });

        manualLabel = new JLabel("Please enter a code and press assign");

        manualPanel.add(manualEntryField);
        manualPanel.add(manualAssignButton);
        manualPanel.add(manualLabel);

    }
    return manualPanel;
}

private JPanel getUploadPanel() {
    if(uploadPanel == null){
        uploadPanel = new JPanel();
    }
    return uploadPanel;
}

private void closeApplication() {
    System.exit(0);
}
}

注意:我无法解释为什么更改解决了NPE问题,我只是在重构“可疑”代码。

我解决了与NullPointerException相关的查询:

问题在于您声明了类变量:

JTextField manualEntryField = null;
只要写下:

private JTextField manualEntryField;
只要删除空的东西,代码的其余部分就可以了。不能说为什么会发生,但可能是其他人可以

这是您的代码,仅进行了该更改,请立即尝试:

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class Test{

public static final Test application = new Test();
    private JFrame jFrame = null;
    private JPanel jContentPane = null, buttonsPanel = null, cardPanel = null, manualPanel = null, uploadPanel = null, defaultPanel = null;
    private JPanel[] mainPanel = {getDefaultPanel(), getManualPanel(), getUploadPanel()};
    private JButton manualButton = null, uploadButton = null, manualAssignButton = null;
    private JTextField manualEntryField;
    private JLabel manualLabel = null;

    final static String DEFAULTPANEL = "Default";
    final static String MANUALPANEL = "Manual";
    final static String UPLOADPANEL = "Upload";

    /**
     * Main method
     * @param args
     */
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                application.getJFrame().setVisible(true);
            }
        });
    }

    /**
     * Get the main application frame
     * @return JFrame
     */
    private JFrame getJFrame() {
        if (jFrame == null) {
            jFrame = new JFrame();
            jFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
            jFrame.setResizable(false);
            // Add the main content pane
            jFrame.setContentPane(getJContentPanel());
            jFrame.addWindowListener(new java.awt.event.WindowAdapter() {   
                public void windowClosing(java.awt.event.WindowEvent e) {    
                    closeApplication();
                }
            });
        }
        jFrame.pack();
        jFrame.setLocationRelativeTo(null);
        return jFrame;
    }

    /**
     * Get main content
     * @return JPanel
     */
    private JPanel getJContentPanel(){
        if (jContentPane == null) {
            jContentPane = new JPanel();
            jContentPane.setPreferredSize(new Dimension(500, 200));
            jContentPane.setLayout(new BorderLayout());
            jContentPane.add(getButtonsPanel(), BorderLayout.NORTH);
            jContentPane.add(getCardPanel(), BorderLayout.CENTER);
        }
        return jContentPane;
    }

    private JPanel getButtonsPanel() {
        if(buttonsPanel == null){
            buttonsPanel = new JPanel();
            buttonsPanel.setPreferredSize(new Dimension(500, 50));
            buttonsPanel.setBorder(BorderFactory.createLineBorder(Color.gray));

            manualButton = new JButton("Enter manually");
            manualButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    CardLayout cl = (CardLayout)(cardPanel.getLayout());
                    cl.show(cardPanel, MANUALPANEL);
                }
            });

            uploadButton = new JButton("Upload file");
            uploadButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    CardLayout cl = (CardLayout)(cardPanel.getLayout());
                    cl.show(cardPanel, UPLOADPANEL);
                }
            });

            buttonsPanel.add(manualButton);
            buttonsPanel.add(uploadButton);
        }
        return buttonsPanel;
    }

    private JPanel getCardPanel() {
        if(cardPanel == null){
            cardPanel = new JPanel(new CardLayout());
            cardPanel.setPreferredSize(new Dimension(500, 200));
            cardPanel.setBorder(BorderFactory.createLineBorder(Color.gray));
            cardPanel.add(mainPanel[0], DEFAULTPANEL);
            cardPanel.add(mainPanel[1], MANUALPANEL);
            cardPanel.add(mainPanel[2], UPLOADPANEL);
        }
        return cardPanel;
    }

    private JPanel getDefaultPanel() {
        if(defaultPanel == null){
            defaultPanel = new JPanel();
        }
        return defaultPanel;
    }

    private JPanel getManualPanel() {
        if(manualPanel == null){
            manualPanel = new JPanel();
            manualPanel.setLayout(new FlowLayout());

            manualEntryField = new JTextField(10);
            manualEntryField.setText("Enter code");

            manualAssignButton = new JButton("Assign");
            manualAssignButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                 // Here is the exception
                    System.out.println(manualEntryField.getText().trim());
                }
            });

            manualLabel = new JLabel("Please enter a code and press assign");

            manualPanel.add(manualEntryField);
            manualPanel.add(manualAssignButton);
            manualPanel.add(manualLabel);

        }
        return manualPanel;
    }

    private JPanel getUploadPanel() {
        if(uploadPanel == null){
            uploadPanel = new JPanel();
        }
        return uploadPanel;
    }

    private void closeApplication() {
        System.exit(0);
    }
}

关于

你能发布一个简短但完整的程序来演示这个问题吗?什么时候会出现异常?当按下按钮时?你的代码有输入错误。按钮被声明为
manualButton
,并被指定为
manualAssignButton
。我也试过你的代码,但它没有给我任何异常。我认为这并不是完全正确的演示您正在运行的代码。它可以这样工作。您的方法返回一个JPanel,而JTextField是该类的一个实例变量……在您的实际代码中是否还有其他地方您正在使用该变量执行操作?在程序中,该按钮声明为mmanualAssignButton,我只是没有正确地复制它。没有即使textbox为空,它也不会抛出NPE。getText不会返回null如果没有文本,它将返回一个空字符串。当我在框中键入时,以及当框为空时,都会发生这种情况。感谢您的帮助,但将其粘贴到我的程序中仍然会导致相同的错误。我发布了一些不同的代码,这些代码应该可以演示他problem@SelketDaly在检查是否每个变量都已初始化之前,请先在生成NPE的行上调试代码。我们已经解决了NPE,但无法完全解释为什么它现在可以工作(或以前失败)。谢谢!测试程序现在可以运行了,但实际应用程序仍在抛出错误。我们将再次查看它+1,以便找到另一种方法,代码中出现了一些可疑的情况,尽管我正在尝试找出这些情况,但实际上是什么导致了这种情况:-) Regards@SelketDaly:如果要删除该空字段,只需右键私有JTextField manualEntryField;那么这个错误就消失了:-)Regards@mKorbel:当然可以,请便。那将是我的荣幸,呵呵。当做