方法上的java.lang.NullPointerException
单击此java应用程序中的按钮时,我收到一个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
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很容易找到…谢谢!我已经看了一段时间了,所以我只是看不见它,新鲜的眼睛显然有帮助:)啊,我不知道你可以做空检查!明亮的谢谢你的帮助和扩大我的知识面。没问题,我们都是为此而来的。:-)别忘了接受答案。你可以通过点击“向上和向下投票”按钮下的绿色复选按钮来接受答案。