方法上的java.lang.NullPointerException

方法上的java.lang.NullPointerException,java,swing,nullpointerexception,jbutton,Java,Swing,Nullpointerexception,Jbutton,单击此java应用程序中的按钮时,我收到一个java.lang.NullPointerException import java.awt.*; import java.awt.event.*; import javax.swing.*; public class MRA_JFrame extends JFrame implements ActionListener { private JTextField ageField; private JTextField smokesF

单击此java应用程序中的按钮时,我收到一个java.lang.NullPointerException

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

public class MRA_JFrame extends JFrame implements ActionListener
{
    private JTextField ageField;
    private JTextField smokesField;
    private JTextField overweightField;
    private JButton reportButton;
    private JTextArea log;
    private Patient patient;

    public MRA_JFrame()
    {
        super("GDM's Medical risk assessment");
        setSize(500, 300);
        setLocation(200, 200);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        setupGUI();

        setVisible(true);
        ageField.requestFocus();
    }

    public void setupGUI()
    {
        JPanel westPanel = setupWestPanel();
        JPanel centrePanel = setupCenterPanel();

        getContentPane().setLayout(new BorderLayout(5, 5));
        getContentPane().setBackground(Color.DARK_GRAY);
        getContentPane().add(westPanel, BorderLayout.WEST);
        getContentPane().add(centrePanel, BorderLayout.CENTER);
    }

    public JPanel setupCenterPanel()
    {
        Font f = new Font("Courier New", Font.PLAIN, 12);

        log = new JTextArea(5, 20);
        log.setEditable(false);
        log.setFont(f);

        JPanel p = new JPanel(new GridLayout(1, 1));
        p.add(new JScrollPane(log));
        return p;
    }

    public JPanel setupWestPanel()
    {
        JPanel wnPanel = setupWestNorthPanel();
        JPanel wsPanel = setupWestSouthPanel();

        JPanel p = new JPanel(new BorderLayout());
        p.add(wnPanel, BorderLayout.NORTH);
        p.add(wsPanel, BorderLayout.SOUTH);
        return p;
    }

    public JPanel setupWestNorthPanel()
    {
        ageField = new JTextField(5);
        smokesField = new JTextField(5);
        overweightField = new JTextField(5);

        JPanel agePanel = new JPanel(new GridLayout(1, 2));
        agePanel.add(new JLabel("Age: ", JLabel.RIGHT));
        JPanel p = new JPanel();
        p.add(ageField);
        agePanel.add(p);

        JPanel smokesPanel = new JPanel(new GridLayout(1, 2));
        smokesPanel.add(new JLabel("Smokes: ", JLabel.RIGHT));
        p = new JPanel();
        p.add(smokesField);
        smokesPanel.add(p);

        JPanel overweightPanel = new JPanel(new GridLayout(1, 2));
        overweightPanel.add(new JLabel("Overweight: ", JLabel.RIGHT));
        p = new JPanel();
        p.add(overweightField);
        overweightPanel.add(p);

        JPanel np = new JPanel();
        np.setLayout(new BoxLayout(np, BoxLayout.Y_AXIS));
        np.add(agePanel);
        np.add(smokesPanel);
        np.add(overweightPanel);

        return np;
    }

    public JPanel setupWestSouthPanel()
    {
        reportButton = new JButton("Report");
        reportButton.addActionListener(this);

        JPanel p = new JPanel();
        p.add(reportButton);

        return p;
    }

    @Override
    public void actionPerformed(ActionEvent e)
    {
        if(e.getSource() == reportButton)
        {
            System.out.println("I'm Clicked!");
            patient.setAge(ageField, log);
        }
    }
患者类别如下所示

import javax.swing.*;

public class Patient 
{
    private int age;
    private String smoker;
    private String overweight;

    // Consturctor
    public Patient()
    {
        age = 0;
        smoker = "n";
        overweight = "n";  
    }

    public void setAge(JTextField age, JTextArea log)
    {
        try
        {
            this.age = Integer.parseInt(age.getText());

        }
        catch(NumberFormatException nfe)
        {
            log.append("Age must be an integer");

        }
    }

    public void setSmoker(JTextField smoker, JTextArea log)
    {
        if(smoker.getText().equalsIgnoreCase("y") || smoker.getText().equalsIgnoreCase("n"))
        {
            this.smoker = smoker.getText();

        }
        else
        {
            log.append("Smokes must be one 'y', 'Y', 'n' or 'N'");
        }
    }

    public void setOverweight(JTextField overweight, JTextArea log)
    {
        if(overweight.getText().equalsIgnoreCase("y") || overweight.getText().equalsIgnoreCase("n"))
        {
            this.overweight = overweight.getText();

        }
        else
        {
            log.append("overweight must be one 'y', 'Y', 'n' or 'N'");
        }
    }
}        

应用程序将列出报告患者的变量,并告诉用户他们是否在报告中使用了不正确的输入。

您尚未初始化
患者
变量,因此您试图访问空对象的属性。 替换这个

private Patient patient;
用这个

private Patient patient = new Patient();

问题出在
actionPerformed()
方法中。类变量
patient
null

您可以像这样执行
null
检查

public void actionPerformed(ActionEvent e)
{
    if(e.getSource() == reportButton && patient != null)
    {
        System.out.println("I'm Clicked!");
        patient.setAge(ageField, log);
    }
}
或者您可以
初始化
变量

public void actionPerformed(ActionEvent e)
{
    if (patient == null)
    {
        patient = new Patient();
    }

    if(e.getSource() == reportButton)
    {
        System.out.println("I'm Clicked!");
        patient.setAge(ageField, log);
    }
}
或者在声明变量时初始化该变量

private Patient patient = new Patient();

您尚未初始化
患者
类别字段,例如:

private Patient patient = new Patient();

你能提供完整的追踪吗?你在哪一行得到NPE?你有没有试着调试你的程序来找到bug的来源?用堆栈跟踪来找出它真的有那么难吗?通常nullpointerexception很容易找到…谢谢!我已经看了一段时间了,所以我只是看不见它,新鲜的眼睛显然有帮助:)啊,我不知道你可以做空检查!明亮的谢谢你的帮助和扩大我的知识面。没问题,我们都是为此而来的。:-)别忘了接受答案。你可以通过点击“向上和向下投票”按钮下的绿色复选按钮来接受答案。